JPanel.getBounds()意外返回0

时间:2015-02-21 21:24:36

标签: 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);
    JOptionPane.showMessageDialog(contentPane, contentPane.getBounds());

我想用setContentPane,我会在我的JFrame中填充整个可用空间。所以它会自动设置JPanel的界限。

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

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

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

此外,组件在大小超过0x0

之前不会被绘制

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

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

  

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

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

虽然有几种方法可以解决这个问题,但问题何在?您将contentPane的布局管理器设置为null的事实令人担忧,并且建议您现在需要重新发明轮子并替换布局管理器为您执行的作业。

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

答案 1 :(得分:2)

大概是因为这是在你的主frame构造函数中,当你调用setVisible(true)时,你还没有在主框架(顶级窗口)上调用JOptionPane.showMessageDialog

如果是这样,那么GUI组件还没有被渲染,所以它们的边界为[0,0]。如果您将JOptionPane.showMessageDialog移至setVisible之后,您将获得维度。

或者,您可以致电pack来解决问题。根据我在下面的评论,您可以在执行此操作前致电contentPane.setPreferredSize(new Dimension(width, height));