用于复杂类交互的Java Swing设计模式

时间:2009-06-09 07:15:15

标签: java swing edt

4 个答案:

答案 0 :(得分:3)

  1. 您的GUI类最终会有许多方法可以使它保持最新状态,这很好。如果它让您担心,总会有选择将GUI分解为子GUI,每个子GUI具有不同的功能或一小组相关功能。方法的数量显然不会改变,但它会更有条理,更连贯和分离。

  2. 不要让GUI中的每个方法创建一个Runnable并使用SwingUtilities.invokeLater将该更新放在EDT上,我建议您尝试另一种解决方案。对于我的个人项目,我使用Swing Application Framework(JSR296),它有一些方便的Task类用于启动后台作业,然后success方法自动在EDT线程上。如果您不能使用它,您应该尝试为后台作业创建自己的类似框架。

答案 1 :(得分:1)

在这里,你的部分答案设计问题......

看起来您希望组件之间存在松耦合。 在您的情况下,我将使用中介作为GUI的消息调度程序。

ChatManager和Scheduler将生成UpdateUIMessage。

我会以这种方式编写GUI

public class MyView {

    public void handleUpdateMessage(final UpdateUIMessage msg){
        Runnable doRun = new Runnable(){
            public void run(){
                handleMessageOnEventDispatcherThread(msg);
            }
        };
        if(SwingUtilities.isEventDispatcherThread()){
            doRun.run();
        } else {
            SwingUtilities.invokeLater(doRun);
        }
    }
}

因此,您的GUI上只有一个公共方法,可以处理所有EdT内容。

如果你想在GUI和其他组件之间松耦合(意思是:你不希望GUI知道其他组件的所有API),GuiController也可以发布ActionMessage(在特定的线程上? ),由调解员发送给其他组成部分。

希望它有所帮助。

答案 2 :(得分:1)

好吧,我会改变你正在使用的世界。你有3个班级,每个班级都只是聊天世界的观察者。 MVC是处理问题的方法。您必须为您的世界创建模型,在本例中为聊天程序。该模型将存储数据,聊天队列,朋友列表并密切关注一致性并通知所有对变化感兴趣的人。此外,将有几个观察者对世界状态感兴趣,并将其状态反映给用户和服务器。 GUI将可视化带到朋友列表和消息队列,并对其更改做出反应。调度程序正在查看计划任务的更改以及更新模型及其结果。 ChatManager最好在SessionManager,MessageDispatcher,MessageAcceptor等几个类中完成它的工作。你有3个空中心的类。创建中心并使用此中心和Observer Pattern将它们连接在一起。然后每个班级只处理一个班级,只处理有趣的事件。一个GUI类是个坏主意。划分为更多表示逻辑组的子类(模型视图)。这是如何征服UI的方式。

答案 3 :(得分:1)

您可能希望查看最初作为Flex开发的MVC框架启动的项目。 PureMVC已被移植到许多编程语言,包括Java。虽然它只是在写这个时处于alpha状态!