JPanel.getBounds() 意外 returns 0
JPanel.getBounds() unexpected returns 0
我有一个从 JFrame 扩展的 class。
在它的构造函数中我生成了一个 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 中填充整个可用 space。所以它会自动设置 JPanel 的边界。
我需要获取 JPanel 的边界,但是 getBounds() returns x = 0, y = 0, width = 0, height = 0。
JPanel 的其他大小相关方法(如 getWidth() 等)也 return 0。如果我显式设置 JPanel 的 setBounds(),方法 return 我给定的值。
奇怪的是,setBackground 填充了我的 JFrame 中的整个可用空间 space。因此,我的 JPanel 的大小必须与我的 JFrame 的大小完全相同。但好像不是。
可能这个问题是由布局管理器引起的,就像大多数与容器相关的问题一样。但是有了布局管理器,我也得到了 0.
我认为这是一个非常愚蠢的问题,很容易解决,但我无法弄清楚问题所在。
我没有在网上找到这个问题的答案,所以希望没有重复一些 post。
大概因为这是在你的主要 frame
构造函数中,你在调用 [=12= 时没有在主框架(顶层 window)上调用 setVisible(true)
]?
如果是,则 GUI 组件尚未呈现,因此它们的边界为 [0, 0]。如果将 JOptionPane.showMessageDialog
移动到 setVisible
之后,您将获得一个维度。
或者,您可以致电 pack
进行布置。根据我在下面的评论,您会在执行此操作之前先致电 contentPane.setPreferredSize(new Dimension(width, height));
。
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.
实际上不,内容窗格将小于框架,因为它包含在框架装饰中。这意味着可见 space 是 window 的大小 - 装饰的大小。
此外,只有组件的大小超过 0x0 时才会绘制组件
在 contentPane
知道它有多大之前,它需要由它的父容器进行布局。为了让父容器布置子容器,它需要知道它们可能喜欢的大小。
正如你所说,这与布局管理器有关,为了让容器知道它可以有多大,它需要知道它的父容器会给它多少space。
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
,但是,同样,因为您已经否定了布局管理器,所以这不会产生您满意的值。 ..
我有一个从 JFrame 扩展的 class。 在它的构造函数中我生成了一个 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 中填充整个可用 space。所以它会自动设置 JPanel 的边界。
我需要获取 JPanel 的边界,但是 getBounds() returns x = 0, y = 0, width = 0, height = 0。 JPanel 的其他大小相关方法(如 getWidth() 等)也 return 0。如果我显式设置 JPanel 的 setBounds(),方法 return 我给定的值。
奇怪的是,setBackground 填充了我的 JFrame 中的整个可用空间 space。因此,我的 JPanel 的大小必须与我的 JFrame 的大小完全相同。但好像不是。
可能这个问题是由布局管理器引起的,就像大多数与容器相关的问题一样。但是有了布局管理器,我也得到了 0.
我认为这是一个非常愚蠢的问题,很容易解决,但我无法弄清楚问题所在。 我没有在网上找到这个问题的答案,所以希望没有重复一些 post。
大概因为这是在你的主要 frame
构造函数中,你在调用 [=12= 时没有在主框架(顶层 window)上调用 setVisible(true)
]?
如果是,则 GUI 组件尚未呈现,因此它们的边界为 [0, 0]。如果将 JOptionPane.showMessageDialog
移动到 setVisible
之后,您将获得一个维度。
或者,您可以致电 pack
进行布置。根据我在下面的评论,您会在执行此操作之前先致电 contentPane.setPreferredSize(new Dimension(width, height));
。
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.
实际上不,内容窗格将小于框架,因为它包含在框架装饰中。这意味着可见 space 是 window 的大小 - 装饰的大小。
此外,只有组件的大小超过 0x0 时才会绘制组件
在 contentPane
知道它有多大之前,它需要由它的父容器进行布局。为了让父容器布置子容器,它需要知道它们可能喜欢的大小。
正如你所说,这与布局管理器有关,为了让容器知道它可以有多大,它需要知道它的父容器会给它多少space。
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
,但是,同样,因为您已经否定了布局管理器,所以这不会产生您满意的值。 ..