繁体   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