[英]Java MVC ActionListener in the Controller, JButton in the View. How do I link these together?
在我看来,我创建了一个名为 jbOk 的新 JButton。 我已经完成了 jbOk.setActionCommand("OK")。 在我的 controller 中,我实现了 ActionListener 并覆盖了 actionPerformed() 方法。 在 actionPerformed() 方法中,我创建了一个 If 语句并将其设置为等于我为 JButton 设置的值。 如果相等,它必须打印一些东西。 但事实并非如此。 即使在 if 语句之外,我也做了一个打印语句,但它不打印。
我知道 JButton 没有 actionListener。 我的问题是如何将 actionListener 添加到视图中的 JButton,以便它可以使用 controller 中的 actionPerformed() 方法? 我想将 ActionListener 保留在 controller 中。
我的 controller 中的 actionPerformed 方法:
@Override
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
if(action.equals("OK")) {
System.out.println("WillThisPrint?");
}
System.out.println("WillThisPrint2?");
}
我认为我的构造函数:
public MapView(){
super(new FlowLayout());
setSize(900, 450);
this.add(getRouteComboBox());
jbOk = new JButton("OK");
jbOk.setActionCommand("OK");
add(jbOk);
} //constructor end
好吧,您可以在 controller 中保留ActionListener
的实现,但您需要在视图中添加 controller 的实例:
public MapView(){
super(new FlowLayout());
setSize(900, 450);
this.add(getRouteComboBox());
jbOk = new JButton("OK");
jbOk.setActionCommand("OK");
add(jbOk);
//
jbOk.addActionListener(new MyController());
}
因此,您只需要决定如何创建 controller 的实例以及如何将其传递到视图中:
// MapView class
// using field
private MyController controller = new MyController();
//...
jbOk.addActionListener(controller);
MapView
构造函数注入:private MyController controller;
public MapView(MyController controller) {
this.controller = controller;
// ...
jbOk.addActionListener(this.controller);
}
jbOk.addActionListener(MyController.getInstance());
public class MyController {
private static MyController instance = new MyController();
public static MyController getInstance() {
return instance;
}
// private constructor to disable creation of MyController elsewhere
private MyController() {}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.