Java控制器中的MVC ActionListener,视图中的JButton。我如何link将这些放在一起?
Java MVC ActionListener in the Controller, JButton in the View. How do I link these together?
在我看来,我创建了一个名为 jbOk 的新 JButton。我已经完成 jbOk.setActionCommand("OK")。在我的控制器中,我实现了 ActionListener 并覆盖了 actionPerformed() 方法。在 actionPerformed() 方法中,我创建了一个 If 语句并将其设置为等于我为 JButton 设置的值。如果相等,则它必须打印一些东西。但事实并非如此。即使在 if 语句之外,我也做了一个打印语句,但它没有打印出来。
我知道 JButton 没有 actionListener。我的问题是如何将 actionListener 添加到视图中的 JButton,以便它可以使用控制器中的 actionPerformed() 方法?
我想将 ActionListener 保留在控制器中。
我的控制器中的 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
好吧,您可以在控制器中保留 ActionListener
的实现,但您需要在视图中添加控制器的实例:
public MapView(){
super(new FlowLayout());
setSize(900, 450);
this.add(getRouteComboBox());
jbOk = new JButton("OK");
jbOk.setActionCommand("OK");
add(jbOk);
//
jbOk.addActionListener(new MyController());
}
因此,您只需要决定如何创建控制器实例以及如何将其传递到视图中:
- 如上例所示创建一个本地控制器。
- 在视图中有一个字段class,可以预先初始化或通过构造函数传递:
- 初始化字段
// 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() {}
}
在我看来,我创建了一个名为 jbOk 的新 JButton。我已经完成 jbOk.setActionCommand("OK")。在我的控制器中,我实现了 ActionListener 并覆盖了 actionPerformed() 方法。在 actionPerformed() 方法中,我创建了一个 If 语句并将其设置为等于我为 JButton 设置的值。如果相等,则它必须打印一些东西。但事实并非如此。即使在 if 语句之外,我也做了一个打印语句,但它没有打印出来。
我知道 JButton 没有 actionListener。我的问题是如何将 actionListener 添加到视图中的 JButton,以便它可以使用控制器中的 actionPerformed() 方法? 我想将 ActionListener 保留在控制器中。
我的控制器中的 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
好吧,您可以在控制器中保留 ActionListener
的实现,但您需要在视图中添加控制器的实例:
public MapView(){
super(new FlowLayout());
setSize(900, 450);
this.add(getRouteComboBox());
jbOk = new JButton("OK");
jbOk.setActionCommand("OK");
add(jbOk);
//
jbOk.addActionListener(new MyController());
}
因此,您只需要决定如何创建控制器实例以及如何将其传递到视图中:
- 如上例所示创建一个本地控制器。
- 在视图中有一个字段class,可以预先初始化或通过构造函数传递:
- 初始化字段
// 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() {}
}