2010-04-26 80 views
7

在我的Java类以及我们在其中使用的书中,都展示了一个包含JFrame构造函数的代码的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放在一起?

回答

1

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

您不应该在不需要的地方使用继承来滥用继承。 (好吧,这是双Brace成语,这是完全继承滥用。)这适用于JFrame,JPanel,Thread和几乎所有的东西,除了java.lang.Object

此外它是一个非常好的主意,使字段private和在可能的情况下final。事实证明,对组件的引用通常不需要存储在字段中,至少不需要这样。

+0

所以你不是说像我上面所做的那样不必要地扩展JFrame,而是在一个单独的类中创建一个新的JFrame并向它添加组件?这似乎是一个非常合理的行动方式。你知道有什么好的参考来咨询如何构建swing gui代码吗?感谢您的意见。 – 2010-04-26 22:03:28

1

正如你刚才所说,这似乎是一本书所教授的技巧。我曾经这样做过,至少对不同方面有一个概述是将ui-views与ui-控制器分开。在你的情况下,这意味着你可以为事件处理编写分离的类。另一个有用的技术是使用私有方法来分隔用户界面的不同部分。换句话说,在这种情况下,一般的重构技术也可能会有所帮助。

3

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

0

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

  • 总是私人的属性,当它有可能最终
  • 尽量减少使用私人领域。在构造函数外部不使用的每个组件只能在构造函数中声明,而不能作为字段(在您的示例中为inputLabel)
  • 仅在代码很少涉及时才使用匿名侦听器。当他们变得太大时,通常意味着你必须拆分它们或者私下宣布它们,或者单独的类别
  • 并且像Jonas所说的那样,通过在主要构建块中分开不同的类来保留JFrame,JDialog等类。
相关问题