2012-09-21 81 views
0

我想創建一個包含一些JLabel的JPanel子類。我開始寫我的代碼,但我立即發現一個大問題。添加到JPanel子類中的組件是不可見的(或者它們不會被添加到JPanel中)。這是JPanel的子類的代碼:)就可以了在JPanel子類中添加組件

public class ClientDetails extends JPanel 
{ 

    private JLabel nameAndSurname = new JLabel ("Name & Surname"); 
    private JLabel company = new JLabel ("Company"); 

    private JPanel topPanel = new JPanel(); 

    public ClientDetails() 
    { 

     this.setBackground(Color.white); 
     this.setLayout(new BorderLayout()); 

     topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); 
     topPanel.add(nameAndSurname); 
     topPanel.add(company); 

     this.add(topPanel,BorderLayout.PAGE_START); 

    } 

} 
+1

1)不要擴展組件,只要保留對它們的引用即可。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

對不起,爲什麼不擴展呢?在我的情況下,最好有一個現成的組件來保存我的標籤,使代碼不復雜 – Luca

+1

請參閱[繼承構成](http://en.wikipedia.org/wiki/Composition_over_inheritance)。 –

回答

1

您需要

  • 把JPanel置於頂層容器(如一個JFrame)
  • 調用包(這樣的佈局管理爲你的東西找到空間

public class Test extends JPanel { 

    private JLabel nameAndSurname = new JLabel ("Name & Surname"); 
    private JLabel company = new JLabel ("Company"); 

    private JPanel topPanel = new JPanel(); 
    JFrame frame; 

    public Test() 
    { 
     this.setBackground(Color.white); 
     this.setLayout(new BorderLayout()); 

     topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); 
     topPanel.add(nameAndSurname); 
     topPanel.add(company); 

     this.add(topPanel,BorderLayout.PAGE_START); 

     frame = new JFrame("test"); 
     frame.add(this); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

問題是我在一個JFrame中使用了這個自定義JPanel,這個JFrame也有很多其他組件,所以我不能在我的JPanel子類中創建並打包它。我該如何解決這個問題?謝謝! – Luca

+0

您是否在添加JPanel後重新打包並重新繪製包含JFrame? –

+0

JPanel隨NetBeans IDE一起添加,因此我認爲NetBeans像所有其他組件一樣執行 – Luca