2014-12-04 40 views
0

我试图找到一个类似的查询,但不能因此iam发布此。 我的工作已经作出了一些类似的JButton,JComboBox的等组件的GUI Swing应用程序基于一些业务逻辑在运行时显示/隐藏摆动组件的良好设计模式

我有,我有以下的情况

  1. 常见的一个重要的商业案例组件集应该在任何时候都可以看到
  2. 中的组件集这并不适用于一定的情况下应该被隐藏
  3. 的一套适用应显示在除了什么共同组成的
  4. 有一个要求,我将不得不在JavaFX中重做此应用程序,因此有一种方法可以使此代码独立于Swing技术,这是非常好的。

方法1:在GUI类中有单独的方法来隐藏/取消隐藏组件,并让视图/控制器根据场景来处理它。然而,这取决于视图,并且必须从头开始编写,一旦我移动到JavaFX

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

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

感谢您的帮助!

+0

*“有一个要求,我将不得不在JavaFX中重做此应用程序,因此..”* ..它几乎与Swing无关。 – 2014-12-04 07:03:29

+0

@AndrewThompson:如果我决定使用第一种方法,我会重写代码来隐藏组件,这就是我所指的。对于ex comp1.setVisible(false)将不得不为所有此类组件重写 – 2014-12-04 07:11:23

+0

如果它是Swing,则使用“Action”对象,如果不相关则禁用它们。 – 2014-12-04 07:16:20

回答

0

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

+0

如何解决问题,因为无论我如何构建视图,逻辑都必须写入某个位置。 – 2014-12-04 07:15:13

+0

通过SwiXML构建View之后,可以使用SwiXML来调用构建的组件。对于我的练习,我使用Spring将Listener创建为bean,以将组件和侦听器链接在一起。 – 2014-12-05 04:24:26

1

使用接口,卢克。为您使用的swing组件定义自己的扩展或(更好的)包装,并提供可以使用JavaFX实现的常用操作。因此,您可以实施常见操作,使GUI的部分可见/不可见。另外,您应该将组件分组为逻辑部分,并为这些组提供与技术无关的子控制器/子模型。相应的视图应该有一个方法使自己(in)可见。对于Swing:如果你想使GUI(视图)的一部分不可见,你应该使用CardLayout(一个卡与你的组件和另一个卡与一个空白面板)。方法setVisible可能导致布局问题。

0

以我的解决方案,我使用:

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

与其中Long使用JPanel S之间进行区分的背衬HashMap<Long,JPanel>。然后,当做出一个选择,我做的:

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

HashMap中保持我的组件的参考,因此他们不是垃圾回收,这避免了问题,使用setVisible可以创建。