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



我的控制器类有一个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();
}
}

最新更新