【问题标题】:Best Practice With JFrame Constructors?JFrame 构造函数的最佳实践?
【发布时间】:2010-04-26 21:07:23
【问题描述】:

在我的两个 Java 类中,以及我们在它们中使用的用代码布置 GUI 的书籍中都大量涉及 JFrame 的构造函数。书中的标准技术似乎是初始化所有组件并在构造函数中将它们添加到JFrame中,并在需要的地方添加匿名事件处理程序来处理事件,这也是我的课堂所提倡的。

这似乎很容易理解,并且在创建一个非常简单的 GUI 时很容易使用,但在创建一个非常简单的 GUI 以外的任何东西时似乎很快就会变得丑陋和麻烦。这是我所描述的一个小代码示例:

public class FooFrame extends JFrame {

   JLabel inputLabel;
   JTextField inputField;
   JButton fooBtn;
   JPanel fooPanel;

   public FooFrame() {
      super("Foo");

      fooPanel = new JPanel();
      fooPanel.setLayout(new FlowLayout());


      inputLabel = new JLabel("Input stuff");
      fooPanel.add(inputLabel);

      inputField = new JTextField(20);
      fooPanel.add(inputField);

      fooBtn = new JButton("Do Foo");
      fooBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            //handle event
         }
      });
      fooPanel.add(fooBtn);

      add(fooPanel, BorderLayout.CENTER);
   }

}

这种使用构造函数的方式是在 Java 中编写 Swing 应用程序的最佳方式吗?如果是这样,我可以使用什么技术来确保这种类型的构造函数是有组织和可维护的?如果没有,在 java 中将 JFrame 放在一起的推荐方法是什么?

【问题讨论】:

    标签: java swing constructor jframe


    【解决方案1】:

    当您获得更复杂的 UI 时,我建议您将不同的 JPanel 与 JFrame 分开,以便它们成为您用户界面的“模块”或“构建块”。

    【讨论】:

      【解决方案2】:

      不幸的是,那里有很多坏书。还有很多糟糕的代码。

      您不应该在不必要的地方滥用继承。 (好吧,有双花括号成语,这是完全的继承滥用。)这适用于JFrameJPanelThread 以及除了java.lang.Object 之外的几乎所有内容。

      另外,将字段设置为private 并在可能的情况下设置final 也是一个非常好的主意。事实证明,对组件的引用通常不需要存储在字段中,至少不需要这样。

      【讨论】:

      • 所以你是说不要像我在上面所做的那样不必要地扩展 JFrame,而是在一个单独的类中创建一个新的 JFrame 并向其中添加组件?这似乎是一种非常合理的行动方式。您是否知道任何好的参考资料来咨询如何构建 swing gui 代码?感谢您的意见。
      【解决方案3】:

      正如你刚才所说,这似乎是一种书本上教授的技术。我以前做的,至少对不同方面有一些概述,就是将 ui-views 与 ui-controllers 分开。在您的情况下,这意味着您可以为事件处理编写单独的类。另一种有用的技术是使用私有方法来分隔 UI 的不同部分。换句话说,一般的重构技术在这种情况下也可能会有所帮助。

      【讨论】:

        【解决方案4】:

        我这里没有明确的规定,除了:

        • 始终将属性设为私有,并在可能的情况下设为最终属性
        • 尽量减少私有字段的使用。每个未在构造函数之外使用的组件只能在构造函数中声明,而不是作为字段(在您的示例中为 inputLabel)
        • 仅在涉及的代码很少时才使用匿名侦听器。当它们变得太大时,通常意味着您必须将它们分解或在私有或单独的类中声明它们
        • 就像 Jonas 所说,通过将主要构建块分解为单独的类来保持 JFrame、JDialog 等类的精简。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 2017-09-13
          • 2022-11-04
          • 1970-01-01
          • 2021-02-13
          • 2010-11-14
          • 1970-01-01
          相关资源
          最近更新 更多