gpt4 book ai didi

java - JPanel.getBounds() 意外返回 0

转载 作者:行者123 更新时间:2023-12-01 16:59:41 29 4
gpt4 key购买 nike

我有一个从 JFrame 扩展的类。在其构造函数中,我生成一个 JPanel:

    JPanel contentPane = new JPanel();
contentPane.setBackground(Color.BLACK);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JOptionPane.showMessageDialog(contentPane, contentPane.getBounds());

我认为使用 setContentPane,我可以填充 JFrame 中的整个可用空间。所以它会自动设置 JPanel 的边界。

我需要获取 JPanel 的边界,但 getBounds() 返回 x = 0, y = 0, width = 0, height = 0。JPanel 的其他与大小相关的方法(如 getWidth() 等)也返回 0。如果我显式设置 JPanel 的 Bounds(),这些方法将返回我给定的值。

令人好奇的是,setBackground 填充了我的 JFrame 中的整个可用空间。因此,我的 JPanel 的大小必须与我的 JFrame 的大小完全相同。但似乎并非如此。

也许这个问题是由布局管理器引起的,就像大多数与容器相关的问题一样。但是使用布局管理器,我也得到 0。

我认为这是一个非常愚蠢的问题,很容易解决,但我无法弄清楚问题所在。我在网上没有找到这个问题的答案,所以希望没有重复一些帖子。

最佳答案

The curious thing about that is, that the setBackground fills the whole available space in my JFrame. So, the size of my JPanel must be exactly the size of my JFrame. But it doesn´t seem so.

实际上不会,内容 Pane 将比框架小,因为它包含在框架装饰内。这意味着可视空间就是 window 的大小 - 装饰品的大小。

此外,组件在其大小超过 0x0 之前不会被绘制

contentPane 知道它有多大之前,它需要由其父容器进行布局。为了让父容器布置子容器,它需要知道它们可能想要的大小。

正如你所说,这与布局管理器有关,为了让容器知道它可以有多大,它需要知道它的父容器会给它多少空间。

Maybe this problem is caused by the layout manager, like most Container-related problems. But with a layout manager, I also get 0.

即使在布局管理器的管理下,容器也不会被分配大小,直到父容器的大小适当为止。

虽然有多种方法可以克服这个问题,但问题是为什么?您将 contentPane 的布局管理器设置为 null 的事实令人担忧,并且表明您现在需要重新发明轮子并替换布局管理器为您所做的工作。

我建议在尝试获取组件大小之前调用 pack ,但是,由于您已经否定了布局管理器,这不会产生您满意的值...

关于java - JPanel.getBounds() 意外返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651519/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com