处理MVC模型,jbuttons和ActionListener的getSource()方法

时间:2015-04-03 21:17:44

标签: java model-view-controller jbutton actionlistener private

所以我在使用MVC编写程序时偶然发现了这个问题。 我在JButton课程中有私人 View。我编写了将侦听器添加到所有相应按钮的方法。但是,当我尝试对ActionPerformed()部分进行编码时,会引发错误JButton无法显示。

JButton设置为public可以完全解决问题,但这是正确的做法吗?是否有其他方法可以设置ActionListener而无需公开JButton

public class learningView extends JFrame {
    private JButton viewButton = new JButton("View Resources");

    public void addButtonListener(ActionListener listenerForButtons) { 

    viewButton.addActionListener(listenerForButtons);
    saveButton.addActionListener(listenerForButtons);
    addButton.addActionListener(listenerForButtons);

    }
}

public class learningController {

    private learningModel theModel;
    private learningView theView;

    public learningController(learningModel theModel, learningView theView) {

    this.theModel = theModel;
    this.theView = theView;

    this.theView.addButtonListener(new buttonListener());

}

class buttonListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == theView.viewButton) {// This is where problem arises

        }

    }

}

}

Hastebin用于视图和控制器类(没有模型)以方便使用。 http://www.hastebin.com/ecawolusal.avrasm

1 个答案:

答案 0 :(得分:1)

由于viewButton拥有对LearningVew的私人访问权限,因此只能在该类上下文中无法访问它。

现在,在更改访问级别之前,您可以考虑更改方法。

而不是向每个通知外部源的按钮添加ActionListener,让视图监控按钮本身可能更简单。

在您开始讨论如何破坏MVC之前,我们的想法是让视图为相关按钮引发更简单,更专用的事件,例如,viewButton可能会引发{ {1}}或其他东西,然后控制器会响应。

这将要求您为视图和控制器定义viewWasActivated合同,以便他们知道他们能够相互传递哪些信息以及可能触发哪些事件。这可以保护视图控件,并且意味着您不需要不必要地暴露视图控件。

更详细地说明here

另一种选择是使用按钮的interface属性,而不是将按钮的引用与事件源进行比较,但首先需要检查动作事件的来源是否为按钮。 ..而且我个人不喜欢"批量" actionCommand,他们很快变得凌乱......