如何在JavaFXML中创建KeyEvents?

如何在JavaFXML中创建KeyEvents?,javafx,fxml,onkeypress,key-events,Javafx,Fxml,Onkeypress,Key Events,我创建了这个小项目来测试关键事件。但当我按下按键时,它的行为并不是我想要的。实际上,我需要计算器项目的关键事件。我创建了一个计算器项目,除了鼠标点击之外,我还想添加一个功能,可以通过键盘输入数字或运算符。有人能检查一下这个,让它更实用吗 public class FXMLDocumentController implements Initializable{ @FXML private Label label; @FXML private Button backSpace; @FXML p

我创建了这个小项目来测试关键事件。但当我按下按键时,它的行为并不是我想要的。实际上,我需要计算器项目的关键事件。我创建了一个计算器项目,除了鼠标点击之外,我还想添加一个功能,可以通过键盘输入数字或运算符。有人能检查一下这个,让它更实用吗

public class FXMLDocumentController implements Initializable{

@FXML
private Label label;

@FXML
private Button backSpace;

@FXML
private Button spaceBar;

@FXML
private Button enter;

@FXML
void typedBS(KeyEvent event) {
    if (event.getCode() == KeyCode.BACK_SPACE) {
        label.setText(event.getText() + " typed.");
    }
}

@FXML
void typedE(KeyEvent event) {
    if (event.getCode()==KeyCode.ENTER) {
        label.setText(event.getText() + " typed");
    }
}

@FXML
void typedSB(KeyEvent event) {
    if (event.getCode()==KeyCode.SPACE) {
        label.setText(event.getText()+" typed");
    }
}

@FXML
void PressBackSpace(KeyEvent event) {
    if (event.getCode() == KeyCode.BACK_SPACE) {
        label.setText("You pressed Back Space key!");
    }
}

@FXML
void clickBackSpace(ActionEvent event) {
    label.setText("You clicked Back Space key!");
}

@FXML
void clickEnter(ActionEvent event) {
    label.setText("You clicked Enter key!");
}

@FXML
void clickSpaceBar(ActionEvent event) {
    label.setText("You clicked SpaceBar key!");
}

@FXML
void pressEnter(KeyEvent event) {
    if (event.getCode() == KeyCode.ENTER) {
        label.setText("You pressed Enter key!");
    }
}

@FXML
void pressSpaceBar(KeyEvent event) {
    if (event.getCode() == KeyCode.SPACE) {
        label.setText("You pressed SpaceBar key!");
    }
}

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}

}在同一事物中定义事件和处理。 试着这样做: 如果您使用边框窗格作为示例

borderPane.setOnKeyPressed(this::handleKeyPress);

private void handleKeyPress(KeyEvent event) {
    if (event.getCode() == KeyCode.BACK_SPACE) {
        label.setText(event.getText() + " typed.");
    }
    if (event.getCode() == KeyCode.SPACE) {
        label.setText("You pressed SpaceBar key!");
    }
     //TODO
}
希望能有帮助

如果你看这个FXML文件,你可以看到我的根节点AnchorPane有一个onKeyPressed和onkeyreased

在这段代码中,我将所有按钮添加到了HasMap中。这样,在我的keyevent处理程序中,我能够根据我按下的键盘键检索按钮


戈登,谢谢你的回答。我的意思是,我想在JavaFXML应用程序中使用这些。在JavaFX中,它正在工作。。。我也在努力掌握JavaFXML,所以如果可以的话,请在JavaFXML项目中展示一些关于这个问题的代码。在我的回答中,我发布了控制器类的代码。你在使用SceneBuilder吗?你似乎在问两个问题?你的根节点是什么?是的,我在使用Scene Builder。
<AnchorPane id="AnchorPane" onKeyPressed="#handleOnKeyPressed" onKeyReleased="#handleOnKeyReleased" prefHeight="650.0" prefWidth="855.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="atmfx.FXMLDocumentController">
   <children>
      <BorderPane layoutX="263.0" layoutY="94.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <left>
            <AnchorPane fx:id="apLeftDisplay" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
               <children>
@FXML
private void handleOnKeyReleased(KeyEvent event)
{
    System.out.println();
    Button tempButton = buttons.get(event.getText());
    System.out.println("Released key text: " + event.getText());
    System.out.println("Released key code: " + event.getCode());

    if (tempButton != null) {
        tempButton.disarm();
        tempButton.setStyle("");
    }
    else if (event.getCode().equals(KeyCode.ENTER)) {
        tempButton = buttons.get("enter");
        tempButton.disarm();
        tempButton.setStyle("");
    }
    else if (event.getCode().equals(KeyCode.BACK_SPACE)) {
        tempButton = buttons.get("backspace");
        tempButton.disarm();
        tempButton.setStyle("");
    }
    else if (event.getCode().equals(KeyCode.SPACE)) {
        tempButton = buttons.get("space");
        tempButton.disarm();
        tempButton.setStyle("");
    }
}

@FXML
private void handleOnKeyPressed(KeyEvent event)
{
    Button tempButton = buttons.get(event.getText());
    System.out.println("Pressed key text: " + event.getText());
    System.out.println("Pressed key code: " + event.getCode());
    if (tempButton != null) {
        tempButton.arm();
        tempButton.setStyle("-fx-background-color: blue");
    }
    else if (event.getCode().equals(KeyCode.ENTER)) {
        tempButton = buttons.get("enter");
        tempButton.arm();
        tempButton.setStyle("-fx-background-color: blue");
    }
    else if (event.getCode().equals(KeyCode.BACK_SPACE)) {
        tempButton = buttons.get("backspace");
        tempButton.arm();
        tempButton.setStyle("-fx-background-color: blue");
    }
    else if (event.getCode().equals(KeyCode.SPACE)) {
        tempButton = buttons.get("space");
        tempButton.arm();
        tempButton.setStyle("-fx-background-color: blue");
    }
}
Map<String, Button> buttons = new HashMap<>();
TheButtonsParentNode.getChildren().stream().filter((tempNode)
            -> (tempNode instanceof Button)).map((
            tempNode) -> (Button) tempNode).forEachOrdered((tempButton) -> {
        buttons.put(tempButton.getText().toLowerCase(), tempButton);//adding button text and the button to hashmap
    });