劫持Java中的侦听器,传入其他参数

劫持Java中的侦听器,传入其他参数,java,swing,model-view-controller,actionlistener,Java,Swing,Model View Controller,Actionlistener,我正在构建一个简单的应用程序,并在一个简单的MVC模式中实现它,控制器将事件处理程序添加到视图中。下面是将处理程序附加到UI的示例控制器代码 基本上,当单击UI的“保存”按钮时,代码会添加一个事件处理程序。UI包含名称和id号条目。我想要做的是将名称和id号传递到actionPerformed函数中 ui.onAddStudent(new ActionListener(){ @Override public void actionPerformed(ActionEvent e)

我正在构建一个简单的应用程序,并在一个简单的MVC模式中实现它,控制器将事件处理程序添加到视图中。下面是将处理程序附加到UI的示例控制器代码

基本上,当单击UI的“保存”按钮时,代码会添加一个事件处理程序。UI包含名称和id号条目。我想要做的是将名称和id号传递到
actionPerformed
函数中

ui.onAddStudent(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.print("test");
    }
});
UI(另一个文件)中的接收函数如下所示

public void onAddStudent(ActionListener handler){
    //something missing here
    addStudent.addActionListener(handler);
}
我不是很喜欢Java,因为它不是我的专长。我实际上做JavaScript。现在,在JavaScript中有一个类似的处理程序,可以使用
call()
apply()
方法调用该处理程序并传入其他参数。如果上面的代码是在JS中,那么

//in the controller
ui.onAddStudent(function(event,id,name){
    //I can use id and name
});

//in the UI
ui.onAddStudent = function(handler){
    //store into a cache
    //add handler to the button
}

//when student is added (button clicked)
handler.call(this,event,id,name);
如何在Java中执行相同的操作?

您有两个选择:

  • 让它保持原样,让控制器从GUI获取ID和名称(这是最简单的解决方案,IMHO)
  • 使用您自己的事件和侦听器类型,包含此信息。例如:

    public class StudentAddedEvent {
        private long ID;
        private String name;
        ...
    }
    
    public interface StudentAddedListener {
        void studentAdded(StudentAddedEvent event);
    }
    
UI将在按钮上注册一个ActionListener,此ActionListener将执行以下操作:

@Override
public void actionPerformed(ActionEvent e) {
    long id = getIdInGui();
    String name = getNameInGui();
    StudentAddedEvent event = new StudentAddedEvent(id, name);
    for (StudentAddedListener listener : studentAddedListeners) {
        listener.studentAdded(event);
    }
}
你有两个选择:

  • 让它保持原样,让控制器从GUI获取ID和名称(这是最简单的解决方案,IMHO)
  • 使用您自己的事件和侦听器类型,包含此信息。例如:

    public class StudentAddedEvent {
        private long ID;
        private String name;
        ...
    }
    
    public interface StudentAddedListener {
        void studentAdded(StudentAddedEvent event);
    }
    
UI将在按钮上注册一个ActionListener,此ActionListener将执行以下操作:

@Override
public void actionPerformed(ActionEvent e) {
    long id = getIdInGui();
    String name = getNameInGui();
    StudentAddedEvent event = new StudentAddedEvent(id, name);
    for (StudentAddedListener listener : studentAddedListeners) {
        listener.studentAdded(event);
    }
}

您也可以定义自己的
Action
s,并将它们设置为按钮(构造函数参数或setAction)和其他组件


为此扩展AbstractAction。

您也可以定义自己的
操作,并将其设置为按钮(构造函数参数或setAction)和其他组件


为此扩展AbstractAction。

当前正在测试第一个选项,因为控制器确实引用了UI。当我得到它时,我会回来。目前正在测试第一个选项,因为控制器确实引用了UI。我拿到后会回来的。