劫持Java中的侦听器,传入其他参数
我正在构建一个简单的应用程序,并在一个简单的MVC模式中实现它,控制器将事件处理程序添加到视图中。下面是将处理程序附加到UI的示例控制器代码 基本上,当单击UI的“保存”按钮时,代码会添加一个事件处理程序。UI包含名称和id号条目。我想要做的是将名称和id号传递到劫持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)
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); }
@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); }
@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。我拿到后会回来的。