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