所以我在使用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
答案 0 :(得分:1)
由于viewButton
拥有对LearningVew
的私人访问权限,因此只能在该类上下文中无法访问它。
现在,在更改访问级别之前,您可以考虑更改方法。
而不是向每个通知外部源的按钮添加ActionListener
,让视图监控按钮本身可能更简单。
在您开始讨论如何破坏MVC之前,我们的想法是让视图为相关按钮引发更简单,更专用的事件,例如,viewButton
可能会引发{ {1}}或其他东西,然后控制器会响应。
这将要求您为视图和控制器定义viewWasActivated
合同,以便他们知道他们能够相互传递哪些信息以及可能触发哪些事件。这可以保护视图控件,并且意味着您不需要不必要地暴露视图控件。
更详细地说明here。
另一种选择是使用按钮的interface
属性,而不是将按钮的引用与事件源进行比较,但首先需要检查动作事件的来源是否为按钮。 ..而且我个人不喜欢"批量" actionCommand
,他们很快变得凌乱......