有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFx将两个“setOnAction”设置为同一个按钮

我从另一个类获取EventHandler,我想将这个EventHandler和其他ActionEvent设置为同一个按钮。有可能吗

代码如下。 按钮是:“btnAdd”

public void addActionListener(EventHandler<ActionEvent> eventHandlerSetNotSave){
    btnAdd.setOnAction((e)-> {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open Resource File");
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("pictures file format",
                "*.TIF","*.JPG","*.PNG","*.GIF","*.JEPG");
        fileChooser.getExtensionFilters().addAll(extFilter);
        File file = fileChooser.showOpenDialog(null);

        if (file != null &&
                url.equals(emptyImageUrl)? true:alertMessageWarning("The viseme will change, and previous viseme will be delete.")) {
            setImage("file:"+file.toString());
            changeAfterSaved=false;
        }
    });
    btnAdd.setOnAction(eventHandlerSetNotSave);

    btnDelete.setOnAction((e)-> {
        changeAfterSaved=true;
        setImage(emptyImageUrl);
    });
}

共 (2) 个答案

  1. # 1 楼答案

    调用addEventHandler()方法而不是setOnAction(...)

    btnAdd.addEventHandler(ActionEvent.ACTION, (e)-> {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open Resource File");
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("pictures file format",
                "*.TIF","*.JPG","*.PNG","*.GIF","*.JEPG");
        fileChooser.getExtensionFilters().addAll(extFilter);
        File file = fileChooser.showOpenDialog(null);
    
        if (file != null &&
                url.equals(emptyImageUrl)? true:alertMessageWarning("The viseme will change, and previous viseme will be delete.")) {
            setImage("file:"+file.toString());
            changeAfterSaved=false;
        }
    });
    btnAdd.addEventHandler(ActionEvent.ACTION, eventHandlerSetNotSave);
    
  2. # 2 楼答案

    我不知道用JavaFX开箱即用有什么方法可以做到这一点,但有一个简单的解决方法。您可以创建一个简单的类,将事件转发给多个处理程序,如下所示:

    public class MultipleEventHandler<T extends Event> implements
            EventHandler<T> {
    
        private Collection<EventHandler<T>> handler;
    
        public MultipleEventHandler(Collection<EventHandler<T>> handler) {
            this.handler = handler;
        }
    
        @Override
        public void handle(T event) {
            handler.forEach(h -> h.handle(event));
        }
    }
    

    然后可以将所有事件处理程序传递给构造函数,并将该类用作事件处理程序

    MultipleEventHandler<ActionEvent> handler = new MultipleEventHandler<>(asList(e, eventHandlerSetNotSave));
    btnAdd.setOnAction(handler);