Java JPanel按内部组件划分的大小

Java JPanel按内部组件划分的大小,java,user-interface,swing,Java,User Interface,Swing,是否可以告诉JPanel将其大小设置为适合其包含的所有组件?类似于JFrame的pack() 编辑:使用preferredSize的技巧没有帮助。我有一个JSplitPane,其中一个部分是GridBagLayout,有许多标签(见屏幕截图),标签相互重叠 也许您可以通过从面板中移除来执行类似操作 可设置大小(假) 在查看了pack()的源代码之后,我想到了: panel.setPreferredSize(panel.getPreferredSize()); 这将强制配电盘根据其子构件

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

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


也许您可以通过从面板中移除来执行类似操作


可设置大小(假)

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

    panel.setPreferredSize(panel.getPreferredSize());
这将强制配电盘根据其子构件的首选尺寸重新计算其首选尺寸

之后你可能需要也可能不需要打电话;在我的小例子中,这似乎没有什么区别,但Javadoc说:

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


因此,我想这取决于为什么必须重新打包
JPanel

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

panel.setSize(panel.getPreferredSize());
您可能正在对父级执行一些奇怪的操作,以阻止父级的布局管理器执行类似的操作。

我会尝试:

panel.revalidate();
panel.repaint();
这不一定会将面板设置为其首选大小,这更取决于布局管理器决定使用什么

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

更新: 根据你的截图,我可以说: 1)考虑程序性地改变分频器位置。 2)考虑程序化地调整窗口本身的水平尺寸,因为它看起来有点紧,以显示分割窗格的两侧。 或者两者兼而有之。 您可以通过执行以下操作来设置分隔器位置

splitPane.setDividerLocation(newSize);
请记住,有两种重载方法用于此操作,一种采用浮点,另一种采用int。浮点表示大小的百分比,而int表示以像素为单位的大小。该尺寸适用于左侧面板(或该方向的顶部面板)。
我会考虑根据面板的最佳宽度来改变除法器的位置。

jjpItANS在涉及到它的孩子的尺寸时有点挑剔,请看一看。您是否正确使用GridBagLayout?看起来它没有正确设置JPanel的最小尺寸。

javax.swing的秘密只会逐渐显露出来,而且只会出现在那些准备为swing之神提供很多酒的人身上(特别是被撕去的头发、数小时熬夜等)

然而,对于这个例子,我建议如下作为一种瑞士军刀,它通常做你认为框架应该做的事情:

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


我不记得JSplitPane是如何适应这种情况的:尝试一下,您可能会发现它同时验证了这两个组件(右、左、上、下),但如果更改分隔符对您来说都不起作用,我会感到惊讶。

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

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


注意:我的案例中使用了GridBaLayout,下面是一个面板示例:

  • 与其父对象一起调整大小
  • 将宽度设置为父对象的宽度
  • 根据其所有子项的高度总和设置高度

谢谢。如果您不设置大小、设置首选大小或设置最小大小,就可以了。
JPanel panel = JPanel(new GridBagLayout())

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

panel.validate()
panel.repaint()