使用JFrame构造函数的最佳实践?

7

在我的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应用程序的最佳方式?如果是,我可以采用哪些技术来确保这种构造函数的组织和可维护性?如果不是,那么推荐使用什么方法来拼凑一个JFrame?

4个回答

3

当您的UI变得更为复杂时,我建议您将不同的JPanels与JFrame分开,使它们成为您用户界面的"模块"或"构建块"。


1

正如你所说,这似乎是书本上教授的一种技术。我过去做的事情是至少要有一个对不同方面有点了解的概述,就是将 UI 视图与 UI 控制器分离。在你的情况下,这意味着你可以编写独立的事件处理类。另一种有用的技术是使用私有方法来分离 UI 的不同部分。换句话说,通用的重构技术在这种情况下也可能会有所帮助。


1

不幸的是,市场上有很多糟糕的书。而且也有很多糟糕的代码。

你不应该在不必要的地方使用继承,以免滥用(好吧,也有双括号惯用语,这是完全的继承滥用)。这适用于JFrameJPanelThread和几乎除了java.lang.Object之外的所有东西。

同样,将字段设置为private,尽可能设置final是一种非常好的做法。结果表明,组件的引用通常不需要像这样存储在字段中。


所以你的意思是不要像我上面那样不必要地扩展JFrame,而是在一个单独的类中创建一个新的JFrame并向其中添加组件?这似乎是一个相当合理的做法。你知道有哪些好的参考资料可以咨询如何构建Swing GUI代码吗?感谢你的建议。 - David Barry

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接