题 内部组件的JPanel大小


是否可以告诉JPanel将其大小设置为适合它包含的所有组件?就像是 pack() 对于JFrame。

编辑:使用preferredSize的技巧没有帮助。我有JSplitPane,其中一部分是GridBagLayout,有许多标签(见截图),标签相互重叠。

截图http://foto.darth.cz/pictures/screen.png


16
2018-05-11 19:35


起源




答案:


看完源代码后 pack()我想出来了:

    panel.setPreferredSize(panel.getPreferredSize());

这迫使面板根据其子组件的优选尺寸重新计算其优选尺寸。

您可能需要也可能不需要致电 validate() 之后;在我的小例子中,似乎没有任何区别,但Javadoc说:

validate method用于使容器再次布置其子组件。在显示容器后修改此容器的子组件(添加到容器中或从容器中删除,或更改布局相关信息)时,应调用此方法。

所以我想这取决于你为什么要重新包装你的 JPanel


17
2018-05-11 19:53



谢谢。如果你没有setSize,setPreferredSize或setMinimumSize,那就没问题了。 - Nguyen NhatNam


默认 Containers的首选大小与容器给定的首选布局大小相匹配。所以你要做的就是:

panel.setSize(panel.getPreferredSize());

据推测,你正在与父母做一些奇怪的事情来阻止父母的布局经理做相当于此事。


3
2018-05-11 20:04





也许你可以通过从面板中删除来做类似的事情

的setResizable(假);


1
2018-05-11 19:44





我会尝试:

panel.revalidate();
panel.repaint();

这不一定会将面板设置为其首选大小,这更多地取决于布局管理器决定使用的内容。

在从当前显示且可见的面板添加/删除组件的情况下,这非常有用。

更新: 根据您的截图我可以说如下: 1)考虑以编程方式改变分频器位置。 2)考虑以编程方式水平调整窗口本身的大小,因为它看起来有点紧张以显示分割窗格的两侧。 或两者。 您可以通过执行设置分隔符位置

splitPane.setDividerLocation(newSize);

请记住,有两个重载方法,一个采用浮点数,一个int。 float是大小的百分比,而int是大小(以像素为单位)。尺寸适用于左侧面板(或该面板的顶部面板)。 我会考虑根据面板的首选宽度改变分隔位置。


1
2018-05-11 21:11



请参阅编辑确切的问题 - Jakub Arnold


我有一个类似的问题使用 Netbeans GUI Builder。我的内板变得怪异;我试图手动调整最小尺寸和首选尺寸,这是一个令人沮丧的练习。

当我这个问题解决了 将所有最小和首选大小重置为默认值 (在Netbeans GUI Builder中:右键单击JPanel组件 - >属性 - > preferredSize - >重置为默认值)。 当没有强制大小时,jpanel采用内部组件的大小。

注意:在我的案例中使用了GridBaLayout


1
2017-07-07 00:30





JSplitPanes在孩子们的尺寸方面有点挑剔,看看 Java教程。你正确使用GridBagLayout吗?看起来它没有正确设置正确的JPanel的最小尺寸。


0
2018-05-12 23:01





javax.swing的谜团只是逐渐地显露出来,只有那些准备提供许多解放(特别是撕裂的头发,几个小时燃烧午夜油等)给Swing神灵的人。

然而,对于这种情况,我会建议以下作为一种瑞士军刀,通常做你认为框架应该做的事情:

myJPanel.getTopLevelAncestor().validate()

正如神圣的文字所说,“验证这个容器及其所有子组件。” (Container.validate)。 NB getTopLevelAncestor()是一个JComponent方法。

不记得JSplitPane如何适应这个:尝试它,你可能会发现它验证了两个组件(左右,顶部和底部),但如果更改分隔符不会为你做这件事我会感到惊讶。


0
2017-07-05 17:26