内部组件的JPanel大小

时间:2009-05-11 19:35:57

标签: java user-interface swing

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

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

screenshot http://foto.darth.cz/pictures/screen.png

8 个答案:

答案 0 :(得分:19)

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

    panel.setPreferredSize(panel.getPreferredSize());

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

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

  

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

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

答案 1 :(得分:3)

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

panel.setSize(panel.getPreferredSize());

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

答案 2 :(得分:1)

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

的setResizable(假);

答案 3 :(得分:1)

我会尝试:

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

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

如果您从当前显示且可见的面板添加/删除了组件,这将非常有用。

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

来设置分隔符位置
splitPane.setDividerLocation(newSize);

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

对于孩子们的体型,JSplitPanes有点挑剔,看看the Java tutorial。你正确使用GridBagLayout吗?看起来它没有正确设置正确的JPanel最小尺寸。

答案 6 :(得分:0)

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

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

myJPanel.getTopLevelAncestor().validate()

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

无法记住JSplitPane如何适应这一点:尝试它并且您可能会发现它验证了两个组件(右侧和左侧,顶部和底部),但如果更改分隔符并且我会感到惊讶#39;无论如何都要为你做这件事。

答案 7 :(得分:0)

下面是一个面板示例:

  • 调整其父项的大小。
  • 将宽度设置为父级的宽度。
  • 根据所有子项的高度之和设置高度。
JPanel panel = JPanel(new GridBagLayout())

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

panel.validate()
panel.repaint()