JFrame构造函数的最佳实践?

时间:2010-04-26 21:07:23

标签: java swing constructor jframe

在我的两个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的方法是什么?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

你不应该在没有必要的地方使用它来滥用继承。 (好的,有Double Brace习语,这是完全继承滥用。)这适用于JFrameJPanelThread以及几乎除java.lang.Object之外的所有内容。

最好在字段private和尽可能final的字段中创建字段。事实证明,对组件的引用通常不需要存储在字段中,至少不是这样。

答案 3 :(得分:0)

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

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