JPanel应该被添加到JFrame中吗?

时间:2014-07-24 15:36:32

标签: swing jframe jpanel jscrollpane

我有这个代码,我不明白:

    JFrame jframe = new JFrame("Risultati protocolli cercati");
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel body = new JPanel();
    Container c = jframe.getContentPane();
    body.setSize(100, 100);
    body.setLayout(new GridLayout(1000, 1));

    for (int i = 0; i < 1000; i++)
        body.add(new JLabel("JLabel " + i));

    JScrollPane jsp = new JScrollPane(body);

    c.add(jsp);
    jframe.setSize(100, 100);
    //jframe.add(body);
    jframe.setVisible(true);

如果我留下倒数第二行评论,那么一切都会出现,标签和滚动。相反,如果我取消注释该行,我什么也看不见。只有JFrame。为什么会这样?对于我程序的主窗口,我必须执行jframe.add(body)...

2 个答案:

答案 0 :(得分:2)

  

相反,如果我取消注释该行,我什么也看不见。为什么会这样?

以下行

jframe.add(body);

内部调用

jframe.getContentPane().add(body);

JFrame默认情况下使用BorderLayoutadd(component)方法直接将其添加到中心部分,如果再次添加,则最后一个会被最新的替换。

您可以使用add()的重载JFrame方法将其添加到东,西,北和南的另一个部分,如下面的快照所示:

enter image description here

例如:

frame.add(comp,BorderLayout.NORTH); // add in north section
frame.add(comp,BorderLayout.WEST); // add in west section

您可以根据设计或应用程序使用其他Layout Managers

值得一读How to Use BorderLayout

还有一个建议:

根据组件的首选尺寸,使用符合组件的frame.pack()代替frame.setSize()

答案 1 :(得分:1)

布局管理员引起的有趣问题。

  1. 组件只能有一个父组件。首先你添加&#34; body&#34;滚动窗格,然后是&#34; body&#34;当您将其添加到框架的内容窗格时,会从滚动窗格中删除(出于@braj提到的原因)。没什么大不了的,因为它只是意味着你不会看到任何滚动条。

  2. 由于组件直接添加到内容窗格中,您仍应看到标签,但它们不会显示,这是令人困惑的部分。将代码更改为使用&#34; 100&#34; GridLayout和您在循环中创建的组件数。当框架首次显示时,面板将为空。现在,增加框架的高度,您将看到组件出现。发生的事情是你试图在一个小区域中绘制太多的组件,并且由于四舍五入问题,每个组件的高度变为0,因此没有任何东西可以绘制。当你将高度增加到至少100个像素时,每个组件现在可以高1个像素,这样你就会变成垃圾。

  3. 唯一的解决方案是保持&#34;身体&#34;滚动窗格中的面板,以便所有组件将以其首选大小显示。然后,您可以根据需要滚动浏览所有组件。

    使用GridLayou时的提示。您可以使用:

    body.setLayout(new GridLayout(0, 1));
    

    然后意味着网格将具有无限的行和单个列。