2010-04-26 83 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等類。
相關問題