java - 关键事件和焦点 JavaFX

标签 java javafx keyevent

我现在非常困惑。 我在 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/

相关文章:

Java程序运行时错误ArrayIndexOutofBounds

java - 将按钮添加到选项卡和选项卡区域 JavaFX

Java如何使用KeyEvent

C# 控制台按键事件

java - native 方法中出现 fatal error : Using JNIEnv in non-java thread

java - 根据数字程序设置GridView的ImageVIew

java - Java 11 中的 JFoenix

charts - JavaFx 饼图 : control size

Android onkey - dispatchKeyEvent 未触发

java - 如何使用扫描器类获取 String 变量的正确输入?