控制器中的Java MVC ActionListener,视图中的JButton。如何将它们链接在一起?

问题描述 投票:0回答:1

在我看来,我已经创建了一个名为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
java swing model-view-controller jbutton actionlistener
1个回答
0
投票

嗯,您可以在控制器中保留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());

}

因此,您只需要决定如何创建控制器实例以及如何将其传递到视图中即可:

  1. 如上例中那样创建本地控制器。
  2. 在视图类内有一个字段,可以预先初始化或通过构造函数传递它:
    • 初始化字段
// 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. 以单例方式访问控制器: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() {} 
}
© www.soinside.com 2019 - 2024. All rights reserved.