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

控制器中的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。我的问题是如

在我看来,我已经创建了一个名为jbOk的新JButton。我已经完成了jbOk.setActionCommand(“OK”)。在我的控制器中,我实现ActionListener并重写actionPerformed()方法。在actionPerformed()方法中,我创建了一个If语句,并将其设置为等于我设置为JButton的值。如果它相等,它必须打印一些东西。但事实并非如此。即使在if语句之外,我也做了一个打印语句,但它不打印

我知道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

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