我正在为任务编写代码,我需要遵循模型-视图-控制器设计模式来创建基本游戏。 游戏涉及一个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

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

1回复

为什么ActionListener在控制器中不起作用?

这篇文章是这篇文章的继续。 我的软件基本上是基于CardLayout面板的。 现在,我想从cardLayout外部更改面板。 在提供的链接中,我得到了帮助,并且可以正常工作。 现在,我在软件中添加了一个控制器,该控制器位于内部面板( CardLayout )和外部面板之间。 在外部面板
4回复

ActionListener在Java GUI App的控制器中是个好主意吗?

我不想尝试遵循MVC模式。 在互联网上,我看到最着名的例子是计算器,例如这里 。 我开始使用这种MVC模式的实现。 但是现在我对控制器中的动作监听器有些疑虑,因为它们倾向于查看。 有很多变化与视图相关的主要原因 - 字体,颜色,边框等。此外还有仅仅修改视图的actionlistener
1回复

使用MVC创建外部ActionListener

ActionListener的,不工作,没有任何反应时joptionpane应该在弹出crear_Arbitro点击。 在为JFrame中的不同JPanel创建外部ActionListener类时遇到麻烦,其想法是制作一些Jpanel,然后使用JTabbedPane将其插入到JFrame中,并
2回复

MVC-控制器与模型责任

我正在使用GUI控制台进行文字冒险。 我现在进行了设置,以便用户使用视图输入文本(例如“检查键”,“环顾四周”等)。然后使用侦听器将此数据从视图发送到控制器。 文本发送到控制器后,我有点卡住了。 按照MVC模型,我应该将文本从控制器发送到模型并让模型解析并弄清楚该怎么做,还是应该将模型简单
2回复

JAVA Swing MVC - 主控制器?

我在设计我正在尝试开发的应用程序的体系结构时遇到了一些麻烦。 我正在研究JAVA,我开始研究这个应用程序,因为我想加深我对JAVA,架构和模式的整体了解。 我想按照指南来制作一个可重用,低耦合的应用程序,就像它应该的那样。 该应用程序只有一个JFrame,但在其中有几个JPanel,每个J
1回复

MVC从视图创建模型和控制器

我正在使用MVC模式实现应用程序,在某些情况下,我已经从视图创建了模型和控制器,并在视图内部调用了控制器的适当方法。 这是一个设计问题吗?如果可以的话,那将是解决方案,我无法在主面板中创建所有模型,因为其中一些是通过单击GUI来调用的。 这是一个示例代码:
1回复

如何在Java Swing中两个不同的MVC控制器之间正确通信?

你能解释一下Controller如何以简单但仍然正确的方式调用另一个Controller方法吗? 请提供一些代码! 背景:我有2个不同的控制器 - 视图模型和2个库,他们需要相互通信: SettingsWindow / SettingsController / Settin
5回复

在应用MVC模式时让控制器继承视图是否可以?

我正在学习“实践”中的MVC模式,这意味着我正在努力掌握如何在任何给定的Java应用程序中实现它。 通过我刚才提出的另一个问题我变得更聪明了,接下来是我的跟进。 MVC模式的本质是模型不应该既不知道视图也不知道控制器。 但是,控制器和视图必须彼此了解,因为控制器最有可能需要更新视图,并
4回复

如果摆动视图由控制器中的新线程设置,是否需要同步方法

实际上有一个以上的问题。 给定模型视图和控制器。 (矿山耦合很多-View知道其Controller,而Controller知道View。) 是否可以通过基本方式触发Controller中的新线程-使用new Runnable(){ (...) run(){}} ,还是要求它以某种
1回复

MVC模式JButton ActionListener不响应

因此,我试图创建一个简单的测试程序,用户可以在其中输入一些内容到JTextField中,单击“添加” JButton,然后JTextArea将用户字符串添加到JTextArea中(连续添加新行)。 我为按钮添加了actionListener,并具有stateChanged和update方法