我在这方面对 swing 或 GUI 设计没有太多经验(大学里的一些 WPF 应用程序大约是它的高度),但是我的任务是在工作中重构 swing 遗留应用程序的一部分。
我被要求重构的部分围绕着一个弹出窗口,该窗口可以根据某个值对象以三种不同的格式显示。这 3 种不同的格式都共享几个基本字段,然后有条件地确定其他字段。负责这个 GUI 元素的类有 ~5k 长,我认为它应该分为三个子类,它们都在基类中共享内容。但是,我完全不知道这是否是正确的方法。
谁能强调一些用于处理共享按钮/字段等元素的不同摆动组件的策略?
此外,是否有任何大型 OSS 摆动应用程序可用于学习?
更多信息:我正在开发的应用程序是一个大型遗留应用程序,目前结构相当可怕。我是团队的新手(而且是刚毕业的,所以在这方面没有太多经验),并被要求尝试将目前负责显示此弹出窗口的大型类之一分解为更小更易于维护的组件。本质上,应用程序中有一个弹出窗口,允许用户响应某些事件,并且根据他们需要响应的请求的子类型,它具有三种不同的外观。大部分 GUI 元素在所有三种子类型中都是一致的,因此我很想知道继承是否是这里的最佳方法,或者是否有其他策略来处理这个问题?
阅读评论,我想我可以回答这个问题。 一个真正的答案需要一本书。
-
将您的 GUI 分解为描述您的 GUI 所需的尽可能多的嵌套
JPanel
。 使用BorderLayout
的简单嵌套JPanel
比使用GridBagLayout
的复杂JPanel
更可取。 需要明确的是,我不是在批评GridBagLayout
. 它在创建表单时很有用。 但它并不是唯一的 Swing 布局管理器。 -
将每个嵌套
JPanel
放入其自己的类中。 -
使用 Swing 组件时使用合成。 当且仅当类将重写其中一个
JComponent
方法时,才使用继承。 -
每个
JPanel
都有自己的JButton
、JLabel
等组件。JBUtton
A 是为JPanel
A 定义的,JButton
B 是为 BJPanel
定义的,即使 GUI 的用户认为它们是同一个按钮。 您可以通过创建包含标签和按钮文本的 GUI 模型来最大程度地减少重复。 必须通过编写 A 和 BJButton
可以执行的常见ActionListener
来消除操作代码(按下按钮时执行的代码)JButton
重复。 -
Swing 应用程序必须从调用
SwingUtilities.invokelater()
开始。 这可确保在事件调度线程 (EDT) 上定义和使用 Swing 组件。 -
Swing 应用程序中仅使用一种
JFrame
。 -
每个 JPanel 都必须定义一个 Swing 布局管理器。
-
某些组件,如
JList
和JTable
,当包含在JScrollPane
中时效果更好。
我确定我已经忘记了一些事情,但这应该是一个好的开始。
如果你要设置一个抽象类来创建 50% 的共享代码,然后从中扩展,会怎么样?
例如:
abstract class BasePopupPanel extends JPanel {
public void initialize() {
// Initialize all the shared code here.
// eg. add(new JButton("TEST");
}
}
现在,您创建实际的弹出面板:
public class GiraffePopupPanel extends BasePopupPanel {
public void initialize() {
super.initialize();
// Here you do all the initializations for this class.
}
}
您可以根据需要创建任意数量的这些内容。当需要添加它们时...
。假设您有一个名为 displayPopup
的方法,那么签名将如下所示:
public void displayPopup(BasePopupPanel popup) {
// do stuff regarding JDialogs, etc.
// ...
popup.initialize();
// do more stuff...
}
我希望这能给你一个关于如何重构类的观点。