Java FX Scene Builder如何按下事件键

时间:2016-04-20 20:03:17

标签: java javafx

我是Java和Java FX的新手,我尝试使用场景构建器制作带按钮的面板。我希望我的应用程序只响应按下的箭头键。我在Controller课程中制作了以下方法:

public void keyPressed(KeyEvent key) {
    switch(key.getCode()) {
        ...some code here
    }
} 

之后我在场景构建器中选择了这个方法,但是当我运行我的应用程序时,按下箭头键时没有任何反应。 有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

如果没有看到你的其余代码和FXML,很难说,这是完整的例子

你错过的可能事情

  • 将keyPress添加为FXML中的操作
  • 将@FXML注释添加到keyPressed()方法

代码

public class Main extends Application {

    private class Controller {
        @FXML  // <== perhaps you had this missing??
        void keyPressed(KeyEvent event) {
            switch (event.getCode()) {
            case LEFT:
            case KP_LEFT:
                System.out.println("to the left");
                break;
            case RIGHT:
            case KP_RIGHT:
                System.out.println("to the right");
                break;
            default:
                break;
            }
        }
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/foo.fxml"));
        loader.setController(new Controller());
        primaryStage.setScene(new Scene(loader.load()));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane onKeyPressed="#keyPressed" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
   <columnConstraints>
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
   </rowConstraints>
   <children>
      <Button mnemonicParsing="false" text="Button" />
   </children>
</GridPane>

答案 1 :(得分:1)

KeyCode还允许与特定密钥进行比较

@FXML
private void keyPressed(KeyEvent keyEvent)
    if (keyEvent.getCode() == KeyCode.ENTER) {
        // do some actions 
    }
}

您可以从here获取所有关键代码。没有使用开关,这是一个很好的方法。

答案 2 :(得分:0)

KeyCodeisArrowKey()方法,因此,如果您从事件处理程序中调用keyPressed方法,则可以执行以下操作:

public void keyPressed(KeyEvent key){
    if(key.getCode().isArrowKey()){
        ...some code here
    }
}

如果您需要根据按下的箭头键执行不同的操作,请确保您的切换案例与KeyCode.UP / DOWN / LEFT / RIGHT进行比较。如果它们是,那么您可能没有正确设置事件处理程序,或者由于线程问题而导致GUI挂起。如果您需要更多帮助,请发布您处理活动的地方。