JavaFX 中的按键侦听器在按下按钮时发生变化

Key Listener in JavaFX that changes on button press

我的控制器 class 有一个 moveButton 方法,可以在单击按钮时将按钮移动到新位置。这工作正常,并被许多做同样事情的按钮调用。我想添加一个按键监听器,这样当一个按钮被点击一次时,直到另一个按钮被点击,用户可以使用向上箭头移动按钮(即调用相同的 moveButton 函数)。下面是我尝试实现它的方式,我也尝试将关键侦听器放在初始化方法中,但似乎都没有用。任何建议将不胜感激!

public void moveButton(ActionEvent actionEvent) {
    Button buttonPressed = (Button) actionEvent.getSource();
    double newAnchor = getNewAnchor(AnchorPane.getBottomAnchor(buttonPressed)) // separate method that returns new anchor location
    AnchorPane.setBottomAnchor(buttonPressed, newAnchor);

    buttonPressed.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                if(event.getCode() == KeyCode.UP){
                    moveButton(actionEvent);
                }
            }
     });
}

不要将事件视为需要传递的数据。将它们用作工作的触发器。通常,不要编写从多个事件和多个节点调用的通用事件处理程序。编写仅调用方法来做某事的简短事件处理程序,并从他们需要完成工作的事件中将其传递给他们。

如果你这样做,那么它会改变你对所有这些东西如何运作的想法,然后它就只是普通的旧 Java,没有魔法。而且很简单:

public class MoveButton extends Application {

    private Node activeButton;
    private Pane pane;

    @Override
    public void start(Stage primaryStage) throws Exception {
        pane = new Pane();
        Scene scene = new Scene(pane, 1200, 800);
        primaryStage.setScene(scene);
        primaryStage.show();
        Button button1 = new Button("Button 1");
        Button button2 = new Button("Button 2");
        button2.setTranslateX(80);
        button1.setOnAction(evt -> buttonClick(button1));
        button2.setOnAction(evt -> buttonClick(button2));
        pane.getChildren().addAll(button1, button2);
        pane.setOnKeyPressed(evt -> moveButton(evt.getCode()));
    }

    private void moveButton(KeyCode keyCode) {
        switch (keyCode) {
            case UP -> activeButton.setTranslateY(activeButton.getTranslateY() - 30);
            case RIGHT -> activeButton.setTranslateX(activeButton.getTranslateX() + 30);
            case DOWN -> activeButton.setTranslateY(activeButton.getTranslateY() + 30);
            case LEFT -> activeButton.setTranslateX(activeButton.getTranslateX() - 30);
        }
    }

    private void buttonClick(Node button) {
        activeButton = button;
        pane.requestFocus();
    }
}