在我看来,我已经创建了一个名为jbOk的新JButton。我已经完成了jbOk.setActionCommand(“ OK”)。在我的控制器中,我实现了ActionListener并覆盖了actionPerformed()方法。在actionPerformed()方法内部,我创建了一个If语句,并将其设置为等于我为JButton设置的值。如果相等,则必须打印一些内容。但事实并非如此。即使在if语句之外,我也执行了print语句,但它不会打印。
我知道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());
}
因此,您只需要决定如何创建控制器实例以及如何将其传递到视图中即可:
// 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() {}
}