我的第一个问题是:“当在与不同的 UI 组件结合使用,这些组件被不同的 Swing JPanel
对象引用,而这些对象(似乎)没有直接相互引用”?
我的第二个问题是:“当操作的actionPerformerd()方法使用两个或更多不同的UI组件引用时,如何在操作和UI组件之间保持引用”?我需要在不同地方的 actionPerformed() 方法中没有直接关系的 ui 上下文(好吧,至少我是这么认为的)。
让我解释一下我正在处理的设计问题......
我有一个 JFrame,它包含所有 UI 逻辑。此 JFrame 包含对 JPanel 逻辑的三个不同引用:ControlPanel
、MainPanel
和 StatusPanel
(全部扩展 JPanel)。
ControlPanel
设置 JMenu 和项目、JToolBar 项目,并且此 JPanel 将添加到安装了所有适当操作的内容 Pane 中。
MainPanel
是与用户进行实际通信的地方。这个 JPanel 包含一个 CardLayout,里面有一堆 JPanel。
StatusPanel
实际上是一个状态栏,处理来自不同 JPanel 的各种文本消息,但由 StatusBarManager 对象处理。这里没有花哨的东西,只有无聊的 GUI 东西。
现在是问题部分:我首先为我能想到的每个操作编写了一堆扩展的AbstractActions
(不是一个好主意)。接下来,我编写了一个 ActionFactory
来为特定任务分发一个 Action
对象,例如: ActionFactory.getAction("file.new");
这似乎是一种更好的方法,因为我现在可以为所有"file"操作实例化一个 FileAction
对象,但有一个区别:actionPerformed()
方法的实现。这“似乎”是个好主意,因为当我在不同的 JPanel
中调用相同的 ActionFactory.getAction("file.new");
时,我得到相同的 Action
返回之前已实例化的对象(节省大量重复对象)。
嗯,这似乎是个好主意,但我仍然在 JPanel 的上下文中挣扎。当我使用 JMenu
和 JMenuItems
选择要在 MainPanel
中显示的“卡片”时,我位于 ControlPanel
中> 仅限 ui 上下文,在 actionPerformed()
方法中,我没有 MainPanel
上下文来使用该 CardLayout
设置“卡片” J 面板。
当我在 MainPanel 中(按下按钮)并且没有 StatusPanel 上下文时,情况也是如此。
我已经在 stackoveflow 上查看了之前的这些建议,但不知何故我无法建立联系。我缺少线索...
关于 SO 行动的类似问答: here , here , here , here , here , here , here , here ,和here .
一些人建议为此使用一个框架,例如 appframework 或 eclipse rcp 或 spring rcp 或其他框架。但由于除了默认 JVM 6 中可用的框架之外的几个原因,我宁愿不使用任何框架。
我希望有人能够解决这个问题,帮助我找到解决问题的好方法。提前感谢您的帮助!
最佳答案
我认为您描述的设计中的主要缺陷是操作直接针对 UI,而不是针对模型/ Controller 。
如果您的操作只是更新模型,并且每个 View 部分与模型的相关部分保持同步,则可以避免一个操作与其他几个 View 组件之间的依赖关系。
这也允许共享通用逻辑。您将该逻辑从操作移动到模型/ Controller ,并且该操作基本上变成了一行(调用该逻辑)。
关于java - 在不引用 JPanel 本身的情况下处理多个 UI JPanel 中的 Swing 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11669438/