2015-04-02 107 views
0

我想添加一個JComponent到一個JPanel然後在窗口中顯示它。我很肯定我的確是對的,但只有面板中的按鈕纔會顯示出來。Java Swing,有一個JComponent和一個JPanel

//Component class 
JFrame window=new JFrame("This is a window"); 
RcComponent component=new RcComponent(); 
JButton button= new Button("This is a button"); 
JPanel panel=new JPanel(); 

panel.add(component); 
panel.add(button); 
window.add(panel); 

window.setVisible(true); 

只有按鈕出現在創建的窗口中。我不太確定我做錯了什麼。

+0

不要忘了「接受」的答案讓人們知道這個問題已經解決了。您還沒有接受任何以前的任何問題的答案。 – camickr 2015-04-03 21:33:25

回答

2

默認情況下,JPanel使用FlowLayout,FlowLayout尊重添加到它的所有組件的首選大小。

如果RcComponent是一個自定義組件,那麼您需要重寫getPreferredSize()方法以返回該組件的Dimension。

@Override 
public Dimension getPreferredSize() 
{ 
    return new Dimension(...); 
} 

如果不重寫此方法,那麼首選的大小爲0,所以沒什麼顯示:

+0

我可以改變佈局來代替重寫方法嗎? – Evando 2015-04-02 20:43:58

+0

'代替重寫方法?' - 覆蓋方法是正確的解決方案。所有Swing組件都應返回合理的維度。當然,您仍然可以使用不同的佈局管理器,因爲每個佈局管理器的工作方式都不同例如,GridLayout會忽略每個組件的首選大小,並使兩個組件的大小相同。但是這仍然不是忽略getPreferredSize()方法的理由。您應該將您的組件設計爲與任何佈局管理器一起使用,因爲需求可能因應用程序而異。 – camickr 2015-04-02 21:05:26

0

我相信你已經錯過了佈局管理器。

https://www.google.com/#q=java%20layout

public static void main(String[] args) { 
    JFrame window=new JFrame("This is a window"); 
    JButton button= new JButton("This is a button"); 
    JLabel lbl= new JLabel("This is a label"); 
    JPanel panel=new JPanel(); 

    panel.setLayout(new GridLayout()); 
    panel.add(button); 
    panel.add(lbl); 
    window.add(panel); 
    window.setSize(new Dimension(200, 200)); 
    window.setLocationRelativeTo(null); 

    window.addWindowListener(new java.awt.event.WindowAdapter() { 

     public void windowClosing(java.awt.event.WindowEvent e) { 
      System.exit(0); 
     } 
    }); 

    window.setVisible(true); 
} 
+0

設置默認關閉操作和這個有什麼區別? – ChiefTwoPencils 2015-04-02 20:46:48

+0

「JPanel」的默認佈局是「FlowLayout」。 – tomse 2015-04-02 20:47:57

+1

你可以在這裏做更多的東西。如檢查未保存的文件等。 – Soley 2015-04-02 20:48:03