2014-01-08 22 views
1

我创建了一个扩展JComponent的类。该类的一个对象被添加到JPanel。 A JPanel有一个默认的流程布局管理器。当我将JPanel添加到JFrame时,除空JFrame之外什么也看不到。是的,框架可以看到并且尺寸达到最大屏幕尺寸。为什么组件不出现在我的JComponent中?

我尝试了几种变型来改变这个问题,并推导出:

  • 元件尺寸 - 它设置无济于事,仍然空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

您可以发布的[SSCCE(http://sscce.org)。如果没有任何组件,这可以说并不多。 –

+0

您可能想看看[在容器中放置组件](http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) –

回答

3

一个JPanel有一个默认的流布局管理器。

是的,FlowLayout尊重每个组件的首选大小。您的组件没有首选大小,因此它默认为(0,0)。

覆盖getPreferredSize()方法以返回适当的维度。

+0

如果我设置了大小,布局管理器会忽略它,并且只会优先考虑大小。这是为什么? – Mushy

+0

@Mushy,这是布局经理的工作方式。布局管理器的工作是设置组件的大小和位置。阅读您的问题下的评论链接的教程。 – camickr

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做。

    “最后,我决定改变,我将我的组件到面板的布局管理器,改变了面板布局管理器到边界布局,然后我添加的组件的中心,现在它出现。”

因此,通过将 LayoutManager设置为 BorderLayout,您告知 JComponent如何布置所添加的组件。它可以是任何 LayoutManager不过,不只是 BorderLayout

相关问题