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