8

我在 Swing 或 GUI 设计方面并没有太多经验(大学中的一些 WPF 应用程序差不多就是它的高度),但是我的任务是在工作中重构 Swing 遗留应用程序的一部分。

我被要求重构的部分围绕着一个弹出窗口,该窗口可以根据某个值对象以三种不同的格式显示。这 3 种不同的格式都共享一些基本字段,然后有条件地确定附加的字段。负责这个 GUI 元素的类大约有 5k 长,我认为它应该分成三个子类,在基类中共享它们都扩展的东西。但是我完全不知道这是否是正确的方法。

谁能强调一些用于处理共享按钮/字段等元素的不同挥杆组件的策略?

另外,有没有大型的 OSS swing 应用可以借鉴?

更多信息:我正在开发的应用程序是一个大型遗留应用程序,目前其结构相当可怕。我是团队的新手(而且是一个相当新的毕业生,所以在这方面没有太多经验),并且被要求尝试分解其中一个负责显示此弹出窗口的大型课程成更小更易维护的组件。本质上,应用程序中有一个弹出窗口,允许用户响应某些事件,根据他们需要响应的请求的子类型,它具有三种不同的外观。大部分 GUI 元素在所有三种子类型中都是一致的,因此我很想知道继承是否是这里的最佳方法,或者是否有其他策略来处理这个问题?

4

2 回答 2

19

看了评论,我想我可以回答这个问题。真正的答案需要一本书。

  1. 将您的 GUI 分解成尽可能多的嵌套JPanels 来描述您的 GUI。JPanel使用 a的简单嵌套BorderLayout优于使用 a 的复杂JPanel嵌套GridBagLayout。需要明确的是,我并不是在批评GridBagLayout. 在创建表单时很有用。但它不是唯一的 Swing 布局管理器。

  2. 将每个嵌套JPanel放入自己的类中。

  3. 使用 Swing 组件时使用组合。当且仅当您的类将覆盖其中一种JComponent方法时才使用继承。

  4. 每个JPanel都有自己的JButton,JLabel等组件。 JBUttonA 是为JPanelA 定义的,JButtonB 是为JPanelB 定义的,即使 GUI 的用户认为它们是同一个按钮。您可以通过创建一个包含标签和按钮文本的 GUI 模型来最小化重复。您必须通过编写A 和B 可以执行的 commonActionListener来消除重复的操作代码(按下按钮时执行的代码) 。JButtonJButton

  5. Swing 应用程序必须以调用SwingUtilities.invokelater(). 这可确保在事件调度线程 (EDT) 上定义和使用 Swing 组件。

  6. 在 Swing 应用程序中只使用一个。 JFrame

  7. 每个 JPanel都必须定义一个 Swing 布局管理器。

  8. 某些组件,例如JListand JTable,在包含在JScrollPane.

我确定我忘记了一些事情,但这应该是一个好的开始。

于 2013-01-28T17:43:18.180 回答
2

如果您要设置一个创建 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...
}

我希望这能让你对如何重构你的类有一个看法。

于 2013-01-28T17:53:15.663 回答