Java JPanel.getBounds()意外返回0

Java JPanel.getBounds()意外返回0,java,swing,jpanel,size,Java,Swing,Jpanel,Size,我有一个从JFrame扩展而来的类。 在其构造函数中,我生成一个JPanel: JPanel contentPane = new JPanel(); contentPane.setBackground(Color.BLACK); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); J

我有一个从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 explicit的setBounds(),这些方法将返回给定的值

奇怪的是,挫折填充了JFrame中的所有可用空间。因此,我的JPanel的大小必须正好是我的JFrame的大小。但事实似乎并非如此

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

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

大概是因为这是在你的主
框架中的构造函数中,当你调用
JOptionPane.showMessageDialog
时,你没有调用主框架(顶层窗口)上的
设置可见(true)

如果是这样,那么GUI组件尚未呈现,因此它们的边界为[0,0]。如果将
JOptionPane.showMessageDialog
移动到
setVisible
之后,您将得到一个维度


或者,您也可以调用
pack
来布局。根据我下面的评论,您可以调用
contentPane.setPreferredSize(新维度(宽度、高度))之前执行此操作。

可能是因为这是在主
框架中的构造函数中,在调用
JOptionPane.showMessageDialog
时,您没有调用主框架(顶层窗口)上的
设置Visible(true)

如果是这样,那么GUI组件尚未呈现,因此它们的边界为[0,0]。如果将
JOptionPane.showMessageDialog
移动到
setVisible
之后,您将得到一个维度

或者,您也可以调用
pack
来布局。根据我下面的评论,您可以调用
contentPane.setPreferredSize(新维度(宽度、高度))执行此操作之前

奇怪的是,挫折填充了JFrame中的所有可用空间。因此,我的JPanel的大小必须正好是我的JFrame的大小。但事实似乎并非如此

实际上不,内容窗格将比框架小,因为它包含在框架装饰中。这意味着可视空间是窗口的大小——装饰的大小

此外,组件的大小超过0x0后才会进行绘制

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

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

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

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

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

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

奇怪的是,挫折填充了JFrame中的所有可用空间。因此,我的JPanel的大小必须正好是我的JFrame的大小。但事实似乎并非如此

实际上不,内容窗格将比框架小,因为它包含在框架装饰中。这意味着可视空间是窗口的大小——装饰的大小

此外,组件的大小超过0x0后才会进行绘制

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

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

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

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

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


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

是的,您是对的。但我不能在赛后再叫它,因为现在太晚了。所以pack()听起来不错,但如果我调用它,它会将我的帧设置为preferredSize,而不是我预设的大小。如何处理这件事?@veritas。这在很大程度上取决于你的最终目标是什么,以及你的小组将要做什么