2016-11-18 4 views
2

私は複数のタブを持つプログラムを持っており、すべてのタブにはそれ自身のコントローラがあります。すべてのタブで異なるキーボードショートカットを使用したいコントローラからJavaFXでキーボードショートカットを設定する方法

しかし、私はEventFilterをSceneに追加する必要があるが、Controller.initialize()が実行されてもシーンがまだnullであるため、これを行う方法が見つからない。これを解決するには?

現在、私はこれをやっている:

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()戻りヌルということ、です。

+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

うれしい私はあなたを助けることができました! –

関連する問題