Java Swing getSize()返回不准确的值?

时间:2011-06-03 19:23:12

标签: java swing user-interface awt sizing

最简单地说,我试图使用组件的宽度来设置其父容器的大小。但是,为组件返回的宽度偏差约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()将简单地使我的对话框超宽,并使滚动条无用。

编辑:我已经解决了我的问题。相当令人尴尬的是,我所有的子面板都没有像它们应该的那样均匀的宽度。有两种解决方案可行。强制它们都是统一的,这可能很棘手,这取决于你对布局有多好。另一个是总结我希望看到的前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
}

2 个答案:

答案 0 :(得分:3)

我想到了两件事:

  1. 您可以在pack()之前使用validate()来建立子面板的几何图形以供日后参考,如example所示。

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

答案 1 :(得分:2)

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