我现在超级困惑。 我已经在fxml代码中创建了一个窗格并设置了一个onKeyPressed事件。KeyEvents和焦点JavaFX
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println("I'm here");
jump(event);
}
});
这没有奏效。窗格没有捕获任何KeyEvent。从不打印“我在这里”。 然后,我想设置场景的onKeyPressed,这是可行的,但我必须在控制器中进行,因为我想在按键过程中处理的事情必须在Controller中完成。
然后我打电话给pane.getScene().setOnKeyPressed()
但是给了nullPointerException
,因为我发现我不得不叫initialize()
以外。
所以我创建了一个按钮和一个附加事件的OnAction给它,它打印出我的窗格的场景,尝试,如果它确实有效。
@FXML
public void printScene() {
System.out.println(pane.getScene());
}
当我点击按钮时,它打印出我的窗格的场景,因为它应该有。但是后来,我意识到我的窗格现在捕获了KeyEvents。除了使用Fxml添加按钮以外,我什么都没有改变,现在窗格捕获KeyEvents?当我注释掉该按钮的代码时,该窗格不再捕获KeyEvents
<Button onAction="#printScene"/>
这是我为按钮使用的所有代码。
注意:我也试过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