我正在构建我的第一个Swing应用程序,并试图弄清楚我的JDialogs - 当用户选择JMenuItem时专门调用 - 可以更新JFrame的主客户区域中的组件,它是父“窗口”整个应用程序。
这是我提出的设计,但不知道它是否:(1)简单不好,(2)不是标准(因此最好)的方式,或者(3)如果我完全在这里偏离基地。任何建议都非常感谢。
基本上,用户选择一个启动JDialog的JMenuItem。用户与对话框中的组件交互,然后单击“完成”。如果一切都有效,那么JDialog会关闭,我希望父窗口(一个JFrame)更新其状态(并最终波及其组件)。
我的设计:
拥有AppStateController
,它是JFrame子类(我的应用程序)的成员。然后,我将创建一个AppStateChangeListener
和AppStateChange
EventObject子类,以便每当对话框验证并关闭时,它都会触发AppStateChange
事件。由于父JFrame是该事件的唯一注册侦听器,因此我可以定义一个处理程序来获取传递给它的事件。我会确保AppStateChangeEvent
有足够的元数据来描述所有可能的更改。
从理论上讲,我喜欢这种方法:每次发生不同的事件时,它应该是干净的并且没有“spaghetti”类型的多个控件调用。但是,我担心它可能有点矫枉过正。
最佳做法在这里有什么要求?我不是一个真正的GUI人员!
答案 0 :(得分:5)
Java有几种实现observer pattern的方法;讨论了几个here。
EventListenerList
规定的机制可能是最通用的,因为它允许您定义自己的事件和侦听器类型,并且Swing程序员熟悉它。不要让JFrame
成为监听器,而是让最高级JComponent
这样做。 JComponent
的每个实例都有一个合适的protected
成员,listenerList
。
Bound Properties也是一个很好的选择,如here所示。
如果您使用Observable
,则需要使用代理人。
附录:作为具体示例,jfreechart使用EventListenerList
方案来管理图表,数据集和系列事件。相反,jcalendar使用bean properties通知侦听器窗口小部件选择。