KeyEvents和Focus JavaFX

时间:2017-04-08 13:39:21

标签: java javafx keyevent

我现在非常困惑。 我在fxml代码中创建了一个窗格并设置了一个onKeyPressed事件。

pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
   @Override
   public void handle(KeyEvent event) {
       System.out.println( "I'm here");
       jump( event);
   }
});

这没有用。 Pane没有抓住任何KeyEvents。从来没有打印过#34;我在这里&#34;。 然后我想设置场景的onKeyPressed,这是有效的,但是我必须在控制器中完成,因为在按键期间我想要处理的事情必须在Controller中完成。

然后我拨打了pane.getScene().setOnKeyPressed(),但是我发现了nullPointerException,因为我发现我必须在initialize()之外调用它。

所以我创建了一个Button并附加了一个onAction事件,它打印出我的Pane场景,试试它是否真的有效。

@FXML
public void printScene() {
    System.out.println( pane.getScene());
}

当我点击按钮时,它打印出我应该拥有的场景。但后来,我意识到我的Pane现在抓住了KeyEvents。除了使用Fxml添加一个按钮,现在Pane捕获了KeyEvents,我什么都没改变?当我注释掉按钮的代码时,Pane不再捕获KeyEvent

<Button onAction="#printScene"/>

这是我对Button的所有代码。

注意:我也尝试了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获得焦点,反之亦然。

1 个答案:

答案 0 :(得分:0)

这是我在这个网站上的第一个答案,所以我可能不会很好地回答你。

无论如何,我认为错误是在窗格上应用事件,尝试在场景中应用

编辑:我看到您使用pane.getScene();你没有场景对象吗?