javafx向按钮添加其他操作

时间:2017-09-09 21:57:28

标签: java button javafx

你可以帮我解决这个问题吗?

我在课程Cell中创建按钮,并为此按钮添加一些默认操作。

public class Cell {
    private Button button;

    public Cell() {
        this.button = new Button();
        this.button.setOnAction(e -> System.out.println("Default action"));
    }

    public Button getButton() {
        return button;
    }
}

在课程Game中,我想为此按钮添加其他操作,但我希望保持默认操作。

public class Game {

    public Game(Button button) {
        // this add new action to button but delete previous one
        // I want use both actions
        button.setOnAction(e -> System.out.println("additional action"));
    }
}

我知道新动作会覆盖以前的操作。因此,如果我点击该按钮,它将只打印additional action

public class Main extends Application{

    public static void main(String[] args) {
        launch();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Cell cell = new Cell();
        Button button = cell.getButton();
        Game game = new Game(button);
        VBox vBox = new VBox(button);
        Scene scene = new Scene(vBox);
        primaryStage.setScene(scene);
        primaryStage.show();

    }
}

是否可以向按钮添加新操作并保留以前的操作?

2 个答案:

答案 0 :(得分:4)

您可以在设置新操作之前获取当前操作并同时调用旧操作和新操作:

public Game(Button button) {
    EventHandler<ActionEvent> current = button.getOnAction();
    button.setOnAction(e -> {
        current.handle(e);
        System.out.println("additional action");
    });
}

答案 1 :(得分:3)

JavaFX内置支持将多个处理程序附加到事件。查看addEventHandlersetEventHandler的文档(当您调用任何setOn前缀方法时会调用它)。要记住的一件事是,附加addEventHandler的处理程序将在setOn方法之前触发,即最后会触发附加setOnAction的处理程序。您可以将Game更改为以下内容:

public class Game {

  public Game(Button button) {
    // this add new action to button but delete previous one
    // I want use both actions
    button.addEventHandler(ActionEvent.ACTION, e -> System.out.println("additional action"));
  }

}