内部组件调整JPanel大小

24

有没有办法让JPanel自适应大小以适应其包含的所有组件?类似于JFrame的pack()方法。

编辑:使用preferredSize的技巧没有帮助。我有一个JSplitPane,其中一个部分是GridBagLayout,包含许多标签(请参见截图),并且标签彼此重叠。

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

8个回答

22

查看了pack()的源代码后,我得出:

    panel.setPreferredSize(panel.getPreferredSize());

这会强制面板基于其子组件的首选大小重新计算其首选大小。

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

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

所以我想这取决于为什么您必须重新打包您的JPanel


谢谢。如果您不设置setSize、setPreferredSize或setMinimumSize,也没关系。 - Nhat Nam NGUYEN

4
默认情况下,Container具有与容器给出的首选布局大小相匹配的首选大小。因此,您所要做的就是:
panel.setSize(panel.getPreferredSize());

可能您在与父元素进行某种奇怪的操作,以防止父元素的布局管理器执行以下等效操作。


2
也许你可以通过从面板中移除来做类似的操作。 setResizable(false);

1

我会尝试:

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

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

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

更新: 根据您的屏幕截图,我可以说以下内容: 1)考虑编程方式更改分隔符位置。 2)考虑以编程方式水平调整窗口本身大小,因为它似乎太紧凑,无法显示拆分窗格的两侧。 或者两个都可以。 您可以通过执行以下操作来设置分隔符位置:

splitPane.setDividerLocation(newSize);

请注意,此处有两个重载方法,一个接受浮点数,一个接受整数。浮点数表示大小的百分比,而整数表示像素大小。大小是针对左侧面板(或该方向的顶部面板)的。 我建议根据面板的首选宽度考虑更改分隔符位置。

1
我在使用Netbeans GUI Builder时遇到了类似的问题。我的内部面板尺寸出现了奇怪的变化;我试图手动调整最小和首选大小,但这是一项令人沮丧的任务。
当我将所有最小和首选大小重置为默认值时(在Netbeans GUI Builder中:右键单击JPanel组件->属性->preferredSize->重置为默认值),问题得到了解决。当没有强制指定尺寸时,jpanel会采用内部组件的尺寸。 注意:在我的情况下使用了GridBaLayout。

1

javax.swing的奥秘只会逐渐揭示给那些愿意向Swing之神献上许多祭品(特别是扯下来的头发、通宵熬夜等)的人。

然而,对于这个案例,我建议使用以下工具作为一种万能的瑞士军刀,通常可以实现你认为框架应该执行的操作:

myJPanel.getTopLevelAncestor().validate()

作为神圣的文本所说,“验证此容器及其所有子组件。”(Container.validate)。注意getTopLevelAncestor()是JComponent方法。
我记不清JSplitPane如何适应这一点:尝试一下,你可能会发现它验证了两个组件(右和左,上和下),但如果更改分隔符,我会感到惊讶如果这样做对你有帮助。

0

JSplitPanes在处理其子组件的大小时有些棘手,可以参考Java教程。您是否正确使用了GridBagLayout?看起来它没有正确设置JPanel的最小大小。


0
这是一个面板的示例,它具有以下特点:
  • 随父元素调整大小。
  • 将宽度设置为父元素的宽度。
  • 根据所有子元素的高度之和来设置高度。
JPanel panel = JPanel(new GridBagLayout())

panel.setMaximumSize(new Dimension(panel.getMaximumSize().width, panel.getPreferredSize().height))

panel.validate()
panel.repaint()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接