我有这个代码,我不明白:
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)...
答案 0 :(得分:2)
相反,如果我取消注释该行,我什么也看不见。为什么会这样?
以下行
jframe.add(body);
内部调用
jframe.getContentPane().add(body);
JFrame
默认情况下使用BorderLayout
和add(component)
方法直接将其添加到中心部分,如果再次添加,则最后一个会被最新的替换。
您可以使用add()
的重载JFrame
方法将其添加到东,西,北和南的另一个部分,如下面的快照所示:
例如:
frame.add(comp,BorderLayout.NORTH); // add in north section
frame.add(comp,BorderLayout.WEST); // add in west section
您可以根据设计或应用程序使用其他Layout Managers:
根据组件的首选尺寸,使用符合组件的frame.pack()
代替frame.setSize()
。
答案 1 :(得分:1)
布局管理员引起的有趣问题。
组件只能有一个父组件。首先你添加&#34; body&#34;滚动窗格,然后是&#34; body&#34;当您将其添加到框架的内容窗格时,会从滚动窗格中删除(出于@braj提到的原因)。没什么大不了的,因为它只是意味着你不会看到任何滚动条。
由于组件直接添加到内容窗格中,您仍应看到标签,但它们不会显示,这是令人困惑的部分。将代码更改为使用&#34; 100&#34; GridLayout和您在循环中创建的组件数。当框架首次显示时,面板将为空。现在,增加框架的高度,您将看到组件出现。发生的事情是你试图在一个小区域中绘制太多的组件,并且由于四舍五入问题,每个组件的高度变为0,因此没有任何东西可以绘制。当你将高度增加到至少100个像素时,每个组件现在可以高1个像素,这样你就会变成垃圾。
唯一的解决方案是保持&#34;身体&#34;滚动窗格中的面板,以便所有组件将以其首选大小显示。然后,您可以根据需要滚动浏览所有组件。
使用GridLayou时的提示。您可以使用:
body.setLayout(new GridLayout(0, 1));
然后意味着网格将具有无限的行和单个列。