나는 지금 당황하고있다. fxml 코드에서 창을 만들고 onKeyPressed 이벤트를 설정했습니다.KeyEvents and Focus JavaFX
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("I'm here");
jump(event);
}
});
이것은 작동하지 않았습니다. 창은 어떤 KeyEvents도 잡지 않았습니다. 절대로 "나는 여기있다"라고 인쇄하지 않았습니다. 그런 다음 장면의 onKeyPressed를 설정하고 싶었지만 컨트롤러에서 수행해야하는 작업은 키 누르기 중에 처리해야하는 작업이 컨트롤러에서 수행되어야하므로 컨트롤러에서 수행해야합니다.
그런 다음 pane.getScene().setOnKeyPressed()
이라고했는데 nullPointerException
이라고 말하면서 제가 initialize()
밖에 전화해야한다는 것을 알았습니다.
그래서 Button을 만들고 onAction 이벤트를 첨부하여 내 창 장면을 인쇄하여 실제로 작동하는지 확인합니다.
@FXML
public void printScene() {
System.out.println(pane.getScene());
}
단추를 클릭하면 내 창 장면이 인쇄되어 있어야합니다. 그런데 내 창은 이제 KeyEvents를 잡는 것을 깨달았습니다. Fxml을 사용하여 버튼을 추가하는 것을 제외하고는 아무것도 변경하지 않았으며 이제 창은 KeyEvents를 잡아 냅니까? I 버튼에 대한 코드를 주석 때, 창은이 내가 버튼이있는 모든 코드는 더 이상
<Button onAction="#printScene"/>
KeyEvents를 잡을 수 없습니다.
참고 : 또한 작동하지 않는 pane.requestFocus()
및 pane.SetFocusTraversable(true)
도 시도했습니다. 하지만 버튼을 추가하면 갑자기 작동하게됩니까? 나 진짜 혼란 스럽다.
전체 코드 :
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = fxmlLoader.load();
Scene scene = new Scene(root, 800, 600);
primaryStage.setTitle("Game");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
public class Controller {
@FXML private Pane pane;
@FXML private Rectangle cube;
public void initialize() {
pane.requestFocus();
pane.setFocusTraversable(true);
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("I'm here");
jump(event);
}
});
System.out.println(pane.getScene());
}
}
//FXML Code
<Pane fx:controller="sample.Controller" fx:id="pane"
xmlns:fx="http://javafx.com/fxml">
<Rectangle width="800" height="20" layoutY="580" fill="green"/>
<Rectangle fx:id="cube" width="40" height="40" layoutX="5" layoutY="540"/>
<!--<Button />-->
</Pane>
의 주석 버튼 창 이득에 초점을 만들고, 그 반대의 경우도 마찬가지입니다.
왜 버튼을 추가하면 창에 초점이 맞춰 지는지, 왜'pane.requestFocus()'가 작동하지 않는지 잘 모르겠습니다. (답변을 얻으려면 [MCVE]를 게시해야합니다.) 이를 수행하는 가장 좋은 방법은 장면에 리스너를 등록하는 것입니다.이 리스너를 사용하여 장면을 만들 수 있습니다. 이 시점에서 컨트롤러에 대한 참조를 얻을 수 있어야하므로 핸들러에서 컨트롤러에 대한 메서드를 호출 할 수 있습니다. –
최대한 빨리 코드를 게시 해 드리겠습니다. 도움을 주셔서 감사합니다. 또한 initialize() 메서드에서 requestFocus를 호출했습니다. 아마도 작동하지 않는 이유일까요? – Random
@James_D 전체 코드를 게시했습니다. 당신이 볼 수 있다면 기뻐. ^^ – Random