2016-11-18 80 views
2

我有一個程序,它有多個選項卡,每個選項卡都有它自己的控制器。我想在每個選項卡上使用不同的鍵盤快捷鍵。如何在控制器中設置JavaFX中的設置鍵盤快捷方式

但是我無法找到一個方法來做到這一點,因爲我需要EventFilter添加到場景,但是當Controller.initialize()運行後,現場仍有空。如何解決這個問題?

目前我在做這個:

final KeyCombination openDir = new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN); 

    list.getScene().addEventFilter(KeyEvent.KEY_PRESSED, event -> { 
     if (openDir.match(event)) { 
      logger.debug("Event match."); 
     } 
    }); 

問題是,list.getScene()返回null這可能是因爲當控制器初始化現場尚未設置。

+0

也許你應該有一個方法,'addListener'控制器,增加了事件偵聽器,一旦該列表是 –

+0

你可以對如何做到這一點更具體的一個場景的一部分調用該方法?我試圖添加監聽器,但沒有像Android一樣的onShow()事件。 – lsrom

回答

1

玩過後,我發現了以下解決方案。它觀察場景屬性,當場景改變時,它將刪除舊的監聽器並添加一個新的監聽器。

final KeyCombination openDir = new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN, KeyCombination.SHIFT_DOWN); 

EventHandler<KeyEvent> eventHandler = event -> { 
    if (openDir.match(event)) { 
     logger.debug("Event match."); 
    } 
}; 

list.sceneProperty().addListener((observable, oldValue, newValue) -> { 
    if (oldValue != null) { 
     oldValue.removeEventFilter(KEY_PRESSED, eventHandler); 
    } 

    if (newValue != null) { 
     newValue.addEventFilter(KEY_PRESSED, eventHandler); 
    } 
}); 
+0

它的工作原理,謝謝。 – lsrom

+0

很高興我能夠幫助你! –

相關問題