在几个UI JPanel中处理Swing操作而不引用JPanels本身

时间:2012-07-26 12:36:36

标签: java swing action jpanel factory

我的第一个问题是:“当相同的操作与不同的UI组件结合使用时,如何限制Swing Actions的数量(使用AbstractAction作为其他操作的基础)引用了不同的Swing JPanel对象(似乎没有)直接引用彼此“?

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

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

我有一个JFrame,它包含所有UI逻辑。此JFrame包含对JPanel逻辑的三个不同引用:ControlPanelMainPanelStatusPanel(所有扩展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的背景。当我使用MainPanelJMenu选择要在JMenuItems内显示的“卡片”时,我只在ControlPanel ui上下文和actionPerformed()中方法我没有MainPanel上下文来使用该JPanel的CardLayout来设置“卡片”。 当我在MainPanel(按下按钮)并且没有StatusPanel的上下文时,情况也一样。

我已经在stackoveflow上看过这些先前的建议,但不知怎的,我无法建立连接。我错过了线索......

对SO的操作进行相同的Q& A排序: herehereherehereherehereherehere和{ {3}}。

有人建议使用这个框架,如appframework或eclipse rcp或spring rcp,或其他。但是我宁愿不使用任何框架,除了默认JVM 6中提供的其他原因之外。

我希望有人可以对这件事情发表意见,这有助于我找到解决问题的好方法。感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

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

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

这也允许共享共同的逻辑。您将该逻辑从操作移动到模型/控制器,并且操作基本上变成了一个单行(调用该逻辑)。