0

我的第一个问题是:“当相同的动作与不同的 UI 组件结合使用时,我如何限制 Swing 的数量Actions(使用 ,这些 UI 组件被不同的 Swing对象(似乎)没有直接引用彼此”?AbstractActionJPanel

我的第二个问题是:“当操作的 actionPerformerd() 方法使用两个或更多不同的 UI 组件引用时,如何在操作和 UI 组件之间保持引用”?我需要在没有直接关系的不同地方的 actionPerformed() 方法中的 ui 上下文(嗯,至少我是这么认为的)。

让我解释一下我正在处理的设计问题......

我有一个包含所有 UI 逻辑的 JFrame。此 JFrame 包含对 JPanel 逻辑的三个不同引用: a ControlPanel、 aMainPanel和 a StatusPanel(均扩展 JPanel)。

ControlPanel设置 JMenu 和项目、JToolBar 项目和这个 JPanel 被添加到内容窗格中,并安装了所有适当的操作。

MainPanel是与用户进行实际通信的地方。这个 JPanel 拥有一个 CardLayout,里面有一堆 JPanel。

StatusPanel实际上是一个状态栏,处理来自不同 JPanel 的各种文本消息,但由 StatusBarManager 对象处理。这里没有花哨的东西,只是无聊的 gui 东西。

现在是问题部分:我首先为我能想到的每个动作编写了一堆扩展程序AbstractActions(不是那么好)。接下来,我编写ActionFactory了一个Action为特定任务分发 obj 的程序,例如: ActionFactory.getAction("file.new"); 这似乎是一种更好的方法,因为我现在可以FileAction为所有“文件”操作实例化一个对象,但有一个区别:actionPerformed()方法的实现。这“似乎”是个好主意,因为当我调用不同JPanelActionFactory.getAction("file.new");相同对象时,我会Action返回之前已经实例化的相同对象(保存了很多重复的对象)。好吧,这似乎是个好主意,我仍然在JPanels. 当我选择一个“卡片”显示在MainPanel使用JMenuJMenuItems,我ControlPanel仅在 ui 上下文中,并且在actionPerformed()方法中我没有使用该JPanelMainPanel设置“卡”的上下文。CardLayout当我在 MainPanel 中(按下按钮)并且没有 StatusPanel 的上下文时也是如此。

我已经查看了这些关于 stackoveflow 的先前建议,但不知何故我无法建立联系。我错过了线索...

在 SO: 这里这里这里这里这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里这里这里这里

一些人建议为此使用框架,如 appframework 或 eclipse rcp 或 spring rcp 或其他。但我更喜欢根本不使用任何框架,除了默认 JVM 6 中可用的其他原因。

我希望有人能在这件事上大放异彩,帮助我找到解决问题的好方法。提前感谢您的帮助!

4

1 回答 1

3

我认为您描述的设计中的主要缺陷是这些操作直接针对 UI,而不是针对模型/控制器。

如果您的操作只是更新一个模型,并且每个视图部分都与模型的相关部分保持同步,那么您可以避免一个操作与其他几个视图组件之间的依赖关系。

This also allows to share the common logic. You move that logic from the action to the model/controller, and the action becomes basically a one-liner (calling that logic).

于 2012-07-26T12:43:08.487 回答