Java, JFrame:getWidth()返回0

14
setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
setResizable(false);
setUndecorated(true);
System.out.println("--------> "+getContentPane().getWidth()); //----> 0 why is this happening?
我正在尝试确定JFrame的大小。我在Google上搜索并查看了文档,但仍然不知道为什么它不起作用。这个方法对于我尝试的任何其他控件都有效。
编辑: 当在扩展JFrame的类之外调用frame.getWidth()时有效。 但是,如果我替换
System.out.println("--------> "+getContentPane().getWidth());

使用

System.out.println("--------> "+this.getWidth());

getWidth仍会返回0

EDIT2: 我需要在设置可见和其他操作之前知道框架的大小。我需要向框架添加其他控件,它们的坐标和大小取决于框架的大小。


一切都取决于容器的布局方式,如果有setSize()setBounds()的定义,那么任何真实的Dimension只返回可见的Container。否则,如果JComponents将其PreferedSize返回给Container,那么您可以在任何地方获取此Dimension - mKorbel
@madflame991,针对你的第二次编辑,这是不可能的,也没有意义。 - mre
2个回答

13

你得到0的原因是因为你没有调用pack()、setSize(int, int)或setSize(Dimension)中的任何一个方法。只有在调用这些方法之一时,才会计算框架的布局。

JFrame frame = new JFrame("My Frame");
frame.setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
frame.setResizable(false);
frame.setUndecorated(true);
frame.pack(); // Important line!!! 
frame.setVisible(true);
System.out.println("--------> "+getContentPane().getWidth());

我需要在添加控件之前知道宽度。 - adrianton3
2
我运行了测试,似乎你无法获取框架的宽度,因为它不可见,但我意识到,如果你的框架始终是JFrame.MAXIMIZED_BOTH,则框架的宽度等于屏幕宽度,你可以通过 Toolkit tk = Toolkit.getDefaultToolkit();int screenWidth = tk.getScreenSize().width; 来获取屏幕宽度。 - aymeric
谢谢!getScreenSize不是我在寻找的,但它基本上解决了我的问题。 - adrianton3

10

你还没有实现(即setVisible(true)JFrame的可见性,因此它没有大小,因为它还没有布置它的组件。


2
1+。pack()也会渲染JFrame(我相信)。 - Hovercraft Full Of Eels
我在将其可见化后尝试调用它,但它仍然返回0。 - adrianton3
@madflame991,这可能是一个愚蠢的问题,但在使其可见之前,您是否向JFrame添加了任何组件?正如@Hovercraft所提到的,也许调用pack()是更好的选择,因为这将强制容器布置其组件,然后使自己可见。 - mre
包括@Hovercraft Full Of Eels的建议+1。 - mKorbel
1
"pack()是更好的选择。" 同意。 "因为这将强制容器布局其组件" 同意 "然后使自己可见。" 不,它不会。 pack()通常在setVisible(true)之前调用,但本身并不影响可见性。 - Andrew Thompson
@Andrew,你说得完全正确。我忘记删除我的评论了! :D - mre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接