我现在非常困惑。 我在 fxml 代码中创建了一个 Pane 并设置了一个 onKeyPressed 事件。
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
System.out.println( "I'm here");
jump( event);
}
});
这不起作用。 Pane 没有捕获任何 KeyEvents。从未打印过“我在这里”。 然后我想设置场景的 onKeyPressed,它可以工作,但我必须在 Controller 中完成它,因为我想要在按键期间处理的事情必须在 Controller 中完成。
然后我调用了 pane.getScene().setOnKeyPressed()
但出现了 nullPointerException
,因为我发现我必须在 initialize()
之外调用它。
因此,我创建了一个 Button 并向其附加了一个 onAction 事件,该事件打印出我的 Pane 的场景,以尝试它是否真的有效。
@FXML
public void printScene() {
System.out.println( pane.getScene());
}
当我单击该按钮时,它按应有的方式打印出 Pane 的场景。但后来,我意识到我的 Pane 现在捕获了 KeyEvents。除了使用 Fxml 添加按钮之外,我没有进行任何更改,现在 Pane 捕获了 KeyEvents?当我注释掉按钮的代码时, Pane 不再捕获 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 获得焦点,反之亦然。
最佳答案
这是我在这个网站上的第一个回答,所以我可能不太好回答你。
无论如何,我认为错误是在 Pane 上应用事件,请尝试将其应用到场景。
编辑:我看到你使用pane.getScene()
;您没有场景对象?
关于java - 关键事件和焦点 JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294823/