有没有办法让JPanel自适应大小以适应其包含的所有组件?类似于JFrame的pack()
方法。
编辑:使用preferredSize的技巧没有帮助。我有一个JSplitPane,其中一个部分是GridBagLayout,包含许多标签(请参见截图),并且标签彼此重叠。
有没有办法让JPanel自适应大小以适应其包含的所有组件?类似于JFrame的pack()
方法。
编辑:使用preferredSize的技巧没有帮助。我有一个JSplitPane,其中一个部分是GridBagLayout,包含许多标签(请参见截图),并且标签彼此重叠。
查看了pack()
的源代码后,我得出:
panel.setPreferredSize(panel.getPreferredSize());
这会强制面板基于其子组件的首选大小重新计算其首选大小。
之后您可能需要调用validate()
;在我的小例子中,似乎没有任何区别,但是Javadoc说:
validate
方法用于使容器再次布置其子组件。当在该容器被显示后修改了此容器的子组件(添加到容器中或从容器中删除,或更改与布局相关的信息)时,应调用它。
所以我想这取决于为什么您必须重新打包您的JPanel
。
Container
具有与容器给出的首选布局大小相匹配的首选大小。因此,您所要做的就是:panel.setSize(panel.getPreferredSize());
可能您在与父元素进行某种奇怪的操作,以防止父元素的布局管理器执行以下等效操作。
我会尝试:
panel.revalidate();
panel.repaint();
这不一定会将面板设置为其首选大小,更多取决于布局管理器决定使用什么。
在您已添加/删除组件并且当前正在显示和可见的面板的情况下,这非常有用。
更新: 根据您的屏幕截图,我可以说以下内容: 1)考虑编程方式更改分隔符位置。 2)考虑以编程方式水平调整窗口本身大小,因为它似乎太紧凑,无法显示拆分窗格的两侧。 或者两个都可以。 您可以通过执行以下操作来设置分隔符位置:
splitPane.setDividerLocation(newSize);
javax.swing的奥秘只会逐渐揭示给那些愿意向Swing之神献上许多祭品(特别是扯下来的头发、通宵熬夜等)的人。
然而,对于这个案例,我建议使用以下工具作为一种万能的瑞士军刀,通常可以实现你认为框架应该执行的操作:
myJPanel.getTopLevelAncestor().validate()
JPanel panel = JPanel(new GridBagLayout())
panel.setMaximumSize(new Dimension(panel.getMaximumSize().width, panel.getPreferredSize().height))
panel.validate()
panel.repaint()