我创建了一个扩展JComponent
的类。该类的对象被添加到JPanel
。 JPanel
有一个默认的流布局管理器。当我将JPanel
添加到JFrame
时,除了空JFrame
之外什么也看不到。是的,框架可见并且尺寸符合最大屏幕尺寸。
我尝试了几项修改来改变这个问题并推断出:
JFrame
JFrame
最后,我决定更改我添加组件的面板的布局管理器,并将面板布局管理器更改为边框布局。然后我将组件添加到中心,现在它出现了。
我的后续问题是:
JComponent
时,我的注意事项是什么?JComponent
的面板的布局管理器?我天真地问:“如果我可以向面板添加JButton
,并使用默认的流式布局管理器显示,为什么不是自定义JComponent
?
我的自定义JComponent
是一个内部类:
public class OuterClass
{
private class Panel extends JPanel
{
public Panel()
{
add(new Custom());
}
}
private class Custom extends JComponent
{
public Custom()
{
// Initialization of members but not size of component
}
}
}
答案 0 :(得分:3)
JPanel有一个默认的流布局管理器。
是的,FlowLayout尊重每个组件的首选大小。您的组件没有首选大小,因此默认为(0,0)。
重写getPreferredSize()
方法以返回适当的维度。
答案 1 :(得分:2)
“为什么我必须为自定义JComponent更改面板的布局管理器?”
关于JComponent
的事情是它没有默认LayoutManager
来布局组件。如果你运行这个测试,你会看到
public static void main(String[] args) {
JComponent component = new JComponent() {};
System.out.println("JComponent = " + component.getLayout());
JPanel panel = new JPanel();
System.out.println("JPanel = " + panel.getLayout());
}
结果是
JComponent = null
JPanel = java.awt.FlowLayout[hgap=5,vgap=5,align=center]
因此,使用JComponent
,因为它具有null
布局,所以它不知道组件的布局位置。所以你要么
setBounds()
或JComponent
必须做的那样。
“最后我决定更改我添加组件的面板的布局管理器,并将面板布局管理器更改为边框布局。然后我将组件添加到中心,现在它出现了。”< / EM>
LayoutManager
设置为BorderLayout
,您告诉JComponent
如何布置您添加的组件。它可以是任何 LayoutManager
,而不仅仅是BorderLayout