2015-12-27 62 views
3

我的JavaFX 8應用程序在獲得專注時必須登錄到doStuff()。這是相當簡單:如何應對從另一個應用程序獲取焦點?

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

然而,當我顯示一個對話框,用戶關閉它,doStuff()火災。我希望它只在用戶從另一個應用切換到我的時候纔會觸發,例如Alt + 選項卡來自瀏覽器。

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

可能嗎?

編輯:發佈FibreFoXAppelemac的答案需要在顯示對話框之前明確執行額外的步驟。這個解決方案遠非完美,因爲我(或任何一般的開發人員)必須在顯示對話之前記住這一步驟。忘了它會引入很難找到的錯誤。

擴展Dialog自動執行它不是一個選項,因爲我想使用已經擴展原始Dialog的內置對話框。

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

回答

1

我建議在您的對話框中添加一個偵聽器,然後如果對話框剛剛關閉/失去焦點,則允許您不做doStuff()。

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

+0

這樣做,每一個對話聽起來並不很有趣。我希望有一種方法可以自動處理它。 – gronostaj

+0

hmmm,我建議創建一個(陣列)即時對話框列表,爲聽衆創建一個小的子類,並實現向該列表添加一個Instant,然後檢查每個Instant。效率不高,但我認爲它會奏效。 – Appelemac

1

當你打開這樣的對話框,並且只有當這個全局開關是真/假/無論你選擇那麼你可以對該狀態開關作出反應時,你可以使用全局布爾值。

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

當使用CDI你可以注入應用程序範圍的當前實例(但你應該使用的getter/setter和非靜態布爾代替;)

相關問題