0

我正在构建一个简单的应用程序,并在一个简单的 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()orapply()方法来调用处理程序传入额外的参数。如果上面的代码是在 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 中做同样的事情?

4

2 回答 2

3

你有两个选择:

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

    public class StudentAddedEvent {
        private long ID;
        private String name;
        ...
    }
    
    public interface StudentAddedListener {
        void studentAdded(StudentAddedEvent event);
    }
    

UI 会在按钮上注册一个 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);
    }
}
于 2012-12-16T14:04:14.627 回答
1

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

为此扩展 AbstractAction。

于 2012-12-16T14:08:04.320 回答