2015-04-02 108 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