6

最简单地说,我试图使用组件的宽度来设置其父容器的大小。然而,为组件返回的宽度偏离了大约 4 个像素。

更多细节:我有一个对话框,它的中间有水平分布的子面板。该对话框应始终与此子面板列表一样宽,并在列表过长时使用滚动条。我只是尝试使用 1 个子面板来启动它。无论我做什么,返回的子面板的大小总是错误的大约 4 个像素。我可以在我的子面板右侧看到一个非常烦人的 4 像素间隙,使我的对话框看起来很可怕。随着更多子面板的添加,效果明显复合。

我尝试使用什么来获取宽度:

sup-panel.getSize().width;
sub-panel.getBounds().width;
sub-panel.getWidth();
sub-panel.getPreferredSize().width;

都返回相同的错误值。

我尝试调用以使其正常运行的其他事情:

parent.validate();
parent.repaint();
parent.doLayout();

任何帮助,将不胜感激。是故意的吗?我错过了尺寸背后的一些概念吗?这似乎是一致的,但如果我能在某处读到这将是很好的记录。

仅供参考:我使用的是 java 1.3(支持旧版应用程序)

注意:这不是让窗口调整大小的问题,这部分发生得很好。并且子面板的大小似乎已正确设置,因为对其大小的更改反映在为我的代码返回的值中。这些值总是略微偏离。

注意 2:在父容器上调用 pack() 会使窗口看起来像我想要的那样,但它不适用于我的所有场景,因为最终在出现足够的子面板后,将需要出现滚动条。在这种情况下,pack() 只会使我的对话框超宽,并使滚动条无用。

编辑:我已经解决了我的问题。令人尴尬的是,我所有的子面板都没有像它们应该的那样具有统一的宽度。有 2 个有效的解决方案。强制它们全部统一,这可能会很棘手,具体取决于您对布局的掌握程度。另一个是总结我希望可见的前 n 个面板的各个宽度。请注意,要使此解决方案有效,我必须为每个子组件的宽度添加额外的 +1。不知道为什么,但我已经用各种边框和布局对其进行了测试,它非常一致;我想在我没有认真考虑的地方可能有一个像素的额外空间。但重要的是它现在可以完美运行。这是一个数学示例(对于需要强制转换的老式无类型集合,Java 1.3 感到抱歉):

int width = 0;
for(int i = 0; i < MAX_VISIBLE_PANELS; i++)
{
    width += ((SubPanel)panelList.get(i)).getWidth();
    width ++;//extra pixel per panel
}
4

2 回答 2

3

想到两件事:

  1. 您可以使用validate()beforepack()以建立子面板的几何图形以供以后参考,如本示例所示。

  2. 您可能需要考虑 指定的默认间隙FlowLayout,这是 的默认布局JPanel

于 2011-06-03T20:02:12.857 回答
2

相反,您可以pack()打开窗口,然后将窗口大小限制为可用的屏幕尺寸吗?

于 2011-06-03T19:32:40.780 回答