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



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

更多详细信息:我有一个对话框,它的中间有水平分布的子面板。对话框应该总是和这个子面板列表一样宽,一旦列表太长,就使用滚动条。我试过只用一个子面板开始。无论我做什么,返回的子面板的大小总是错误大约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。不知道为什么,但我用各种边界和布局对它进行了测试,它非常一致;我想可能有一个像素的额外空间在某个地方我没有认真思考。但重要的是,它现在运行得很好。下面是一个数学示例(很抱歉老式的无类型集合需要强制转换Java1.3):

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

我想到两件事:

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

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

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

相关内容

  • 没有找到相关文章

最新更新