控制器中的Java MVC ActionListener,视图中的JButton。如何将这些链接在一起?
在我看来,我已经创建了一个名为jbOk的新JButton。我已经完成了jbOk.setActionCommand(“OK”)。在我的控制器中,我实现ActionListener并重写actionPerformed()方法。在actionPerformed()方法中,我创建了一个If语句,并将其设置为等于我设置为JButton的值。如果它相等,它必须打印一些东西。但事实并非如此。即使在if语句之外,我也做了一个打印语句,但它不打印 我知道JButton没有actionListener。我的问题是如何将actionListener添加到视图中的JButton,以便它可以使用控制器中的actionPerformed()方法? 我希望将ActionListener保留在控制器中 我的控制器中的actionPerformed方法:控制器中的Java MVC ActionListener,视图中的JButton。如何将这些链接在一起?,java,swing,model-view-controller,jbutton,actionlistener,Java,Swing,Model View Controller,Jbutton,Actionlistener,在我看来,我已经创建了一个名为jbOk的新JButton。我已经完成了jbOk.setActionCommand(“OK”)。在我的控制器中,我实现ActionListener并重写actionPerformed()方法。在actionPerformed()方法中,我创建了一个If语句,并将其设置为等于我设置为JButton的值。如果它相等,它必须打印一些东西。但事实并非如此。即使在if语句之外,我也做了一个打印语句,但它不打印 我知道JButton没有actionListener。我的问题是如
@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());
}
因此,您只需决定如何创建控制器实例以及如何将其传递到视图中:
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
jbOk.addActionListener(MyController.getInstance())代码>
如何编写第二个选项?第三个选项也给出了一个错误,它无法解析MyController中的方法getInstance()。谢谢。第三个答案教会了我一些新的东西,而且很有效。
private MyController controller;
public MapView(MyController controller) {
this.controller = controller;
// ...
jbOk.addActionListener(this.controller);
}
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() {}
}