簡體   English   中英

Java FX Scene Builder如何按下事件鍵

[英]Java FX Scene Builder How to make event key pressed

我是Java和Java FX的新手,我正在嘗試使用場景生成器制作一個帶有按鈕的面板。 我希望我的應用程序僅在按下箭頭鍵時做出響應。 我在Controller類中做了以下方法:

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

之后,我在場景生成器中選擇了此方法,但是當我運行我的應用程序時,按箭頭鍵沒有任何反應。 有人可以幫我嗎?

沒有看到其余的代碼和FXML,很難說,這里是完整的示例

您錯過的可能事情

  • 在FXML中添加keyPress作為動作
  • 將@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);
    }
}

XML文件

<?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>

KeyCode還允許與特定鍵進行比較

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

您可以從此處獲取所有關鍵代碼。 不使用開關是一種好方法。

KeyCode具有isArrowKey()方法,因此,如果您從事件處理程序中調用keyPressed方法,則可以執行以下操作:

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

如果需要根據按下的箭頭鍵做不同的事情,請確保將開關盒與KeyCode.UP / DOWN / LEFT / RIGHT進行比較。 如果是這樣,則可能是由於線程問題導致您未正確設置事件處理程序或GUI掛起。 如果需要更多幫助,請張貼您在哪里處理活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM