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

gno*_*med 6 java user-interface swing awt sizing

最简单的说,我试图使用组件的宽度来设置其父容器的大小.但是,为组件返回的宽度偏差约4个像素.

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

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

sup-panel.getSize().width;
sub-panel.getBounds().width;
sub-panel.getWidth();
sub-panel.getPreferredSize().width;
Run Code Online (Sandbox Code Playgroud)

所有都返回相同的错误值.

我尝试过让其表现的其他事情:

parent.validate();
parent.repaint();
parent.doLayout();
Run Code Online (Sandbox Code Playgroud)

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

仅供参考:我使用的是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
}
Run Code Online (Sandbox Code Playgroud)

tra*_*god 3

我想到两件事:

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

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