
[英]How to change input focus from floating app window to another application at the background?
[英]How to react to getting focus from another application?
我的JavaFX 8應用程序必須在聚焦時使用doStuff()
。 這很簡單:
primaryStage.focusedProperty().addListener((observable, wasFocused, nowFocused) -> {
doStuff();
});
但是,當我顯示一個對話框並且用戶關閉它時,會觸發doStuff()
。 我希望它只在用戶從另一個應用程序切換到我的應用程序時觸發,例如來自瀏覽器的Alt + Tab 。
換句話說,我想doStuff()
iff其他應用程序的窗口失去焦點,我的應用程序的窗口獲得焦點。
可能嗎?
編輯: FibreFoX和Appelemac發布的答案要求在顯示對話框之前顯式執行其他步驟。 這個解決方案遠非完美,因為我(或者任何開發人員)在顯示對話之前必須記住這一步。 忘記它會引入很難找到的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.