簡體   English   中英

Controller 中的 Java MVC ActionListener,視圖中的 JButton。 我如何將這些鏈接在一起?

[英]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 的實例以及如何將其傳遞到視圖中:

  1. 如上例所示,創建本地 controller。
  2. 有一個內部視圖 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);
}
  1. 實現對 controller 的訪問作為 singleton: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM