用于在运行时根据某些业务逻辑显示/隐藏swing组件的良好设计模式

时间:2014-12-04 07:01:46

标签: java swing design-patterns

我试图找到类似的查询,但因此无法发布此信息。 我正在开发一个swing应用程序,它有一个由许多组件组成的GUI,如JButton,JCombobox等。

我有一个重要的商业案例,其中我有以下情况

  1. 应始终可见一组常见的组件
  2. 应隐藏不适用于特定方案的组件集
  3. 除了常见的
  4. 之外,还应显示适用的组件集
  5. 要求我必须在JavaFX中重做此应用程序,因此有一种方法可以使此代码独立于Swing技术。
  6. 方法#1:在GUI类中有单独的方法来隐藏/取消隐藏组件,让视图/控制器根据场景来处理它。然而,这取决于视图,一旦我转移到JavaFX,就必须从头开始编写

    方法#2:定义一个规则集,该规则集本质上包含可以隐藏的类属性的名称,并通过利用反射让一段共同的代码隐藏/取消隐藏它。这与使用中的视图技术类型无关。 然而,在代码审查过程中反射的使用总是引起人们的注意,因为建议的做法是尽量避免使用它,因此有点难以让人们相信它。

    在复杂性与代码重用和所涉及的工作方面,在这种情况下使用什么是一个好的方法? 还有一种设计模式可能在这种情况下有用吗?

    感谢您的帮助!!

3 个答案:

答案 0 :(得分:1)

使用接口,Luke。为您使用的swing组件定义自己的扩展或(更好)包装器,并提供您也可以使用JavaFX实现的常见操作。因此,您可以实现常用操作,使GUI的各个部分可见/不可见。此外,您应该将组件分组为逻辑部件,并为这些组提供与技术无关的子控制器/子模型。相应的视图应该有一个使自己(in)可见的方法。

对于Swing:如果您想让GUI(视图)的一部分不可见,您应该使用CardLayout(一张卡片包含您的组件,另一张卡片包含空白面板)。 setVisible方法可能会导致布局问题。

答案 1 :(得分:0)

为了降低复杂性并实现代码重用性,使用XML文件定义布局而不是硬编码更好。我建议你使用SwiXML来促进Java Swing构建。详见http://www.swixml.org/

答案 2 :(得分:0)

在我的解决方案中,我使用了:

JPanel mainPanel = new JPanel(new BorderLayout());

使用支持HashMap<Long,JPanel>,其中Long用于区分JPanel。然后,当做出选择时,我做:

mainPanel.remove(oldPanel);
mainPanel.add(newPanel, BorderLayout.CENTER);

HashMap维护对我的组件的引用,因此它们不会被垃圾回收,这可以避免使用setVisible创建的问题。