内部组件的JPanel大小

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

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

截图http://sofzh.miximages.com/java/screen.png

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

  panel.setPreferredSize(panel.getPreferredSize()); 

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

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

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

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

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

 panel.setSize(panel.getPreferredSize()); 

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

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

的setResizable(假);

我会尝试:

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

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

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

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

 splitPane.setDividerLocation(newSize); 

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

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

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

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

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

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

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

 myJPanel.getTopLevelAncestor().validate() 

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

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