Java JPanel.getBounds()意外返回0
我有一个从JFrame扩展而来的类。 在其构造函数中,我生成一个JPanel: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
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。这在很大程度上取决于你的最终目标是什么,以及你的小组将要做什么