我在课程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();
}
}
是否可以向按钮添加新操作并保留以前的操作?
答案 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内置支持将多个处理程序附加到事件。查看addEventHandler
和setEventHandler
的文档(当您调用任何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"));
}
}