我现在非常困惑。 我在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获得焦点,反之亦然。
答案 0 :(得分:0)
这是我在这个网站上的第一个答案,所以我可能不会很好地回答你。
无论如何,我认为错误是在窗格上应用事件,尝试在场景中应用。
编辑:我看到您使用pane.getScene()
;你没有场景对象吗?