我试图找到类似的查询,但因此无法发布此信息。 我正在开发一个swing应用程序,它有一个由许多组件组成的GUI,如JButton,JCombobox等。
我有一个重要的商业案例,其中我有以下情况
方法#1:在GUI类中有单独的方法来隐藏/取消隐藏组件,让视图/控制器根据场景来处理它。然而,这取决于视图,一旦我转移到JavaFX,就必须从头开始编写
方法#2:定义一个规则集,该规则集本质上包含可以隐藏的类属性的名称,并通过利用反射让一段共同的代码隐藏/取消隐藏它。这与使用中的视图技术类型无关。 然而,在代码审查过程中反射的使用总是引起人们的注意,因为建议的做法是尽量避免使用它,因此有点难以让人们相信它。
在复杂性与代码重用和所涉及的工作方面,在这种情况下使用什么是一个好的方法? 还有一种设计模式可能在这种情况下有用吗?
感谢您的帮助!!
答案 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
创建的问题。