Swing:JDialogs如何与JFrame对话

时间:2011-08-16 18:29:10

标签: java swing user-interface

我正在构建我的第一个Swing应用程序,并试图弄清楚我的JDialogs - 当用户选择JMenuItem时专门调用 - 可以更新JFrame的主客户区域中的组件,它是父“窗口”整个应用程序。

这是我提出的设计,但不知道它是否:(1)简单不好,(2)不是标准(因此最好)的方式,或者(3)如果我完全在这里偏离基地。任何建议都非常感谢。

基本上,用户选择一个启动JDialog的JMenuItem。用户与对话框中的组件交互,然后单击“完成”。如果一切都有效,那么JDialog会关闭,我希望父窗口(一个JFrame)更新其状态(并最终波及其组件)。

我的设计:

拥有AppStateController,它是JFrame子类(我的应用程序)的成员。然后,我将创建一个AppStateChangeListenerAppStateChange EventObject子类,以便每当对话框验证并关闭时,它都会触发AppStateChange事件。由于父JFrame是该事件的唯一注册侦听器,因此我可以定义一个处理程序来获取传递给它的事件。我会确保AppStateChangeEvent有足够的元数据来描述所有可能的更改。

从理论上讲,我喜欢这种方法:每次发生不同的事件时,它应该是干净的并且没有“spaghetti”类型的多个控件调用。但是,我担心它可能有点矫枉过正。

最佳做法在这里有什么要求?我不是一个真正的GUI人员!

1 个答案:

答案 0 :(得分:5)

Java有几种实现observer pattern的方法;讨论了几个here

EventListenerList规定的机制可能是最通用的,因为它允许您定义自己的事件和侦听器类型,并且Swing程序员熟悉它。不要让JFrame成为监听器,而是让最高级JComponent这样做。 JComponent的每个实例都有一个合适的protected成员,listenerList

Bound Properties也是一个很好的选择,如here所示。

如果您使用Observable,则需要使用代理人。

附录:作为具体示例,使用EventListenerList方案来管理图表,数据集和系列事件。相反,使用bean properties通知侦听器窗口小部件选择。