Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么组件不出现在我的JComponent中?_Java_Swing_Jpanel_Layout Manager_Jcomponent - Fatal编程技术网

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来设置组件的大小和位置。请阅读在您的问题下的注释中链接到的教程。