java - 如何组织具有多个屏幕/面板的基于 MVC 的程序的 Controller ?

标签 java model-view-controller generics

我目前正在从事一个用 Java 编写的业余爱好项目,其中包含大约两个不同的 JFrames,每个 JFrame 大约有 3-4 个 JPanel。我面临的问题是我不太确定如何处理与我的 Controller 和不同 View 类的交互。

例如,我在 Java App. design with MVC 上有一篇 Sun 的文章,他们列出了让模型和 View 之间的所有通信作为最现代的 Controller 通过 Controller 的选项,我也被教导过这种策略并且应该做得很好。但是,它并没有深入到解释如何处理所有元素和不同面板所涉及的所有 ActionListener。

到目前为止,我学到的“方法”是使用一个 Controller 并通过 getter 将 ActionListener 设置为各种对象并跟踪 Activity 面板。我那本很棒的 Java 书给出的另一种选择是只坚持每个 View 类的内部类。任何一种方法似乎都会产生非常糟糕的代码,而我更喜欢一个或多个 Controller 尽可能少的膨胀。

我的问题当然是;您如何在保持 Controller 可用的同时尽可能整齐高效地分配 ActionListener?

最佳答案

尽管 Markus 的解决方案仍然是我迄今为止看到的最简洁的解决方案,但我还是做了一些细微的改动,希望这些改动在原作者眼中也是改进 ;)。

如果您添加/删除列表中的一个项目以响应某个事件,则有可能以同时对列表进行更改而告终;事件已处理,但如果在捕获事件的事件之后有更多项目,循环将继续。

因此需要使用稍微不同的方法。我决定使用 ListIterator.add() 方法,因为该方法支持在遍历列表项时修改列表。可能有更优雅的解决方案可用,但这个解决方案做得相当不错。

万一对别人有帮助;修改后的代码类似于以下内容:

ListIterator<ActionListener> iterator = mActionListeners.listIterator();

public void actionPerformed(ActionEvent e)
{
    iterator = mActionListeners.listIterator();
    while (iterator.hasNext()) 
    {
        ActionListener actionListener = (ActionListener)iterator.next();
        actionListener.actionPerformed(e);
    }
}

public void addListener(ActionListener listener)
{
    iterator.add(listener);
}

public void removeListener(ActionListener listener)
{
    iterator.remove(listener);
}

如果有更好的解决方案或改进,我也很乐意听到。

关于java - 如何组织具有多个屏幕/面板的基于 MVC 的程序的 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/416760/

相关文章:

java - 如何在 Java 1.7 中编写等效的 lambda 表达式?

java - 使用 javax.xml.validation.Validator 针对 XSD 进行 XML 验证

linq - 在 LINQ 中选择多列

php - 如何在 MVC 应用程序 : CodeIgniter $routes or __remap() for controller selection? 中引导流量

java - 在java泛型中创建子类元素列表

java - 这些通用方法有什么区别?

java - 什么时候会使用 Servlet init params?

iphone - 具有多个相同 subview 的 cocoa touch View

c# - 强制通用参数可从字符串解析的约束

java - EAR 中的差异 部署在 Websphere 应用程序服务器中。 ( war 到耳边)