簡體   English   中英

如何應對從另一個應用程序獲得焦點?

[英]How to react to getting focus from another application?

我的JavaFX 8應用程序必須在聚焦時使用doStuff() 這很簡單:

primaryStage.focusedProperty().addListener((observable, wasFocused, nowFocused) -> {
    doStuff();
});

但是,當我顯示一個對話框並且用戶關閉它時,會觸發doStuff() 我希望它只在用戶從另一個應用程序切換到我的應用程序時觸發,例如來自瀏覽器的Alt + Tab

換句話說,我想doStuff() iff其他應用程序的窗口失去焦點,我的應用程序的窗口獲得焦點。

可能嗎?

編輯: FibreFoXAppelemac發布的答案要求在顯示對話框之前顯式執行其他步驟。 這個解決方案遠非完美,因為我(或者任何開發人員)在顯示對話之前必須記住這一步。 忘記它會引入很難找到的bug。

擴展Dialog以自動執行它不是一個選項,因為我想使用已擴展原始Dialog內置Dialog

這是非常基本的功能,如果在JavaFX中沒有簡單的方法可以實現這一點,我會感到驚訝。

我建議在你的Dialog中添加一個監聽器,如果Dialog剛剛關閉/失去焦點,那么你就不能使用doStuff()。

我能想到的最簡單方法是在對話框關閉時設置Instant(使用Instant.now),如果應用程序重新獲得焦點,則創建另一個Instant,並檢查Duration.between(instantLostFocusDialog, instantGainedFocusApp).getSeconds()超出1(或者將getNano()添加到更具體的那個)。 只有這樣你才能doStuff()

打開這樣的對話框時可以使用全局布爾值,並且只有當該全局開關為true / false /無論你選擇什么時,你才可以對該狀態開關作出反應。

public class GlobalDialogMemory{
    public static boolean dialogShown = false;
}

使用CDI時,您可以注入應用程序范圍的當前實例(但您應該使用getter / setter和非靜態布爾值;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM