Java 为什么组件不出现在我的JComponent中?
我创建了一个扩展Java 为什么组件不出现在我的JComponent中?,java,swing,jpanel,layout-manager,jcomponent,Java,Swing,Jpanel,Layout Manager,Jcomponent,我创建了一个扩展JComponent的类。该类的对象被添加到JPanel。JPanel有一个默认的流布局管理器。当我将JPanel添加到JFrame时,除了一个空的JFrame之外,什么都看不见。是的,框架是可见的,并且尺寸达到了最大屏幕尺寸 我尝试了几次修改来改变这个问题,并推断: 组件大小-将其设置为无效,并且仍然为空JFrame 中间面板-将组件添加到中间面板,但仍然是空的JFrame 最后,我决定更改正在添加组件的面板的布局管理器,并将面板布局管理器更改为边框布局。然后我将该组件添加
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
}
}
}
JPanel有一个默认的流布局管理器
是的,并且FlowLayout尊重每个组件的首选大小。您的组件没有首选大小,因此默认为(0,0)
重写getPreferredSize()
方法以返回适当的维度
JPanel有一个默认的流布局管理器
是的,并且FlowLayout尊重每个组件的首选大小。您的组件没有首选大小,因此默认为(0,0)
重写getPreferredSize()
方法以返回适当的维度
“为什么我必须为自定义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
LayoutManager
设置为BorderLayout
,您告诉了JComponent
如何布局您添加的组件。它可以是任何LayoutManager
,而不仅仅是BorderLayout
“为什么我必须为自定义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
LayoutManager
设置为BorderLayout
,您告诉了JComponent
如何布局您添加的组件。它可以是任何LayoutManager
,而不仅仅是BorderLayout
你可以发布一个。没有任何组件这说明不了多少。你可能想看一看你可以发布一个。没有任何组件这说明不了多少。如果我设置了大小,你可能想看一看,布局管理器似乎忽略了它,只尊重首选的大小。为什么呢?@Mushy,这就是布局管理器的工作方式。布局管理器的工作是设置组件的大小和位置。请阅读在您的问题下的注释中链接到的教程。如果我设置了大小,布局管理器似乎会忽略它,并且只考虑首选的大小。为什么?这是布局管理器的工作方式。@Mushys来设置组件的大小和位置。请阅读在您的问题下的注释中链接到的教程。