为什么组件不出现在我的JComponent中?

时间:2014-01-08 16:39:43

标签: java swing jpanel layout-manager jcomponent

我创建了一个扩展JComponent的类。该类的对象被添加到JPanelJPanel有一个默认的流布局管理器。当我将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
          }
     }
}

2 个答案:

答案 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