[英]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.