2016-11-18 1 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() 반환 컨트롤러가 초기화 될 때 장면이 아직 설정되지 않았기 때문에 아마 인 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

다행 당신을 도울 수있었습니다! –

관련 문제