我正在为任务编写代码,我需要遵循模型-视图-控制器设计模式来创建基本游戏。 游戏涉及一个8x8的JButton阵列,需要按特定顺序选择/取消选择这些按钮才能获胜。

据我所知,声明和实例化每个JButton并添加actionListener的循环应该在View类中找到,而附加到每个JButton的ActionListener实际上应该触发Model类或Controller类中的EventHandler(因为根据MVC,我不应该在View中编写我的EventHandler逻辑)。 这造成了一个问题,因为除非我将ActionListeners从我的Model或Controller类中附加到每个JButton,否则Model或Controller类中的EventHandler不会触发。

解决此问题的常用方法是什么? 我应该如何安排getter和setter在类之间传递ActionEvent? 我可以从View类的EventHandler中调用Controller或Model EventHandler吗? 最后,EventHandler是否属于Model类或Controller类?

任何帮助将非常感激!

===============>>#1 票数:0

我不了解规范的解决方案,因为我既不是专业人员,也不是院士,而是可能的解决方案:

  • 创建JButton的ArrayList或其他集合(HashMap在这里可以很好地工作)以及使用int索引(如果是ArrayList)或String(如果是HashMap)的getter方法。 这将允许控件访问列表中的按钮并插入Actions或ActionListeners。
  • 为您的JButton Actions或ActionListener使用匿名内部类,并让这些侦听器调用与按钮所需操作对应的Control的方法。
  • 让控件在视图上调用一个既创建按钮又添加按钮的AbstractAction的方法。 我喜欢这给您带来的解耦。
  • 在视图中使用匿名内部侦听器类,它们所做的全部是触发SwingPropertyChangeListenerSupport(所有Swing组件固有地具有)来通知任何侦听器(此处为控制对象)状态发生改变(按下按钮)。 也许按钮的ActionCommand可以是PropertyChangeEvent对象的newValue参数。 当然,控件必须向视图添加PropertyChangeListener并侦听这些更改通知。
  • 通过Juice或Spring解耦,以及所有这些。

因此,例如,如果您接受上面的第三条建议,则您的视图可能具有以下内容:

// public method inside of View that Control calls
public void addActionToActionBar(Action action) {
  JButton button = new JButton(action);
  // actionBar would be a JPanel that holds a certain type of button
  actionBar.add(button);
}

然后, for创建按钮的for循环可以全部位于Control类中。

  ask by Christian Abbott translate from so

未解决问题?本站智能推荐: