我的第一个问题是:“当相同的操作与不同的UI组件结合使用时,如何限制Swing Actions
的数量(使用AbstractAction
作为其他操作的基础)引用了不同的Swing JPanel
对象(似乎没有)直接引用彼此“?
我的第二个问题是:“当action的actionPerformerd()方法使用两个或更多不同的UI组件引用时,如何在Actions和UI组件之间保持引用”?我需要在actionPerformed()方法中的ui上下文在不同的地方没有直接关系(好吧,至少这是我的想法)。
让我解释一下我正在处理的设计问题......
我有一个JFrame,它包含所有UI逻辑。此JFrame包含对JPanel逻辑的三个不同引用:ControlPanel
,MainPanel
和StatusPanel
(所有扩展JPanel)。
ControlPanel
设置JMenu和项目,JToolBar项目和此JPanel被添加到contentpane并安装了所有approriate Actions。
MainPanel
是与用户进行实际通信的地方。这个JPanel里面有一堆CardLayout,里面有一堆JPanel。
StatusPanel
实际上是一个状态栏,处理来自不同JPanel但由StatusBarManager对象处理的各种文本消息。这里没有花哨的东西,只是无聊的gui东西。
现在问题部分:我首先为我能想到的每个动作编写了一堆扩展的AbstractActions
(不太好主意)。接下来,我编写了一个ActionFactory
,为特定任务分发Action
obj,例如:ActionFactory.getAction("file.new");
这似乎是一种更好的方法,因为我现在可以为所有“文件”操作实例化FileAction
对象,但有一点不同:actionPerformed()
方法的实现。这似乎是一个好主意,因为当我调用另一个JPanel
相同的ActionFactory.getAction("file.new");
时,我得到了之前已经实例化的相同Action
对象(保存了很多重复的对象) 。
嗯,这似乎是一个好主意,我仍然在努力与JPanels
的背景。当我使用MainPanel
和JMenu
选择要在JMenuItems
内显示的“卡片”时,我只在ControlPanel
ui上下文和actionPerformed()
中方法我没有MainPanel
上下文来使用该JPanel的CardLayout
来设置“卡片”。
当我在MainPanel(按下按钮)并且没有StatusPanel的上下文时,情况也一样。
我已经在stackoveflow上看过这些先前的建议,但不知怎的,我无法建立连接。我错过了线索......
对SO的操作进行相同的Q& A排序: here,here,here,here,here,here,here,here和{ {3}}。
有人建议使用这个框架,如appframework或eclipse rcp或spring rcp,或其他。但是我宁愿不使用任何框架,除了默认JVM 6中提供的其他原因之外。
我希望有人可以对这件事情发表意见,这有助于我找到解决问题的好方法。感谢您的帮助!
答案 0 :(得分:3)
我认为您描述的设计中的主要缺陷是操作直接针对UI,而不是针对模型/控制器。
如果您的操作只是更新模型,并且每个视图部件与模型的相关部分保持同步,则可以避免一个操作与其他几个视图组件之间的依赖关系。
这也允许共享共同的逻辑。您将该逻辑从操作移动到模型/控制器,并且操作基本上变成了一个单行(调用该逻辑)。