为了账号安全,请及时绑定邮箱和手机立即绑定

getWidth()/getHeight() 和 getPreferredSize().width

getWidth()/getHeight() 和 getPreferredSize().width

慕妹3146593 2023-05-17 15:06:08
我正在尝试使用在调整 JFrame 大小时动态调整大小的键来绘制键盘。此外,键可以有不同的大小。我有一个面板,其布局设置为BorderLayout. 在中心,我放置了一个面板,其布局设置为GridLayout(5,1).网格的每一行都是一个JPanelwith FlowLayout。在每一行中,我计算每个按钮并通过调用该setPreferredSize方法设置其首选大小。运行程序时,我只看到一些外观怪异的按钮。getWidth()/getHeight()当我用和用 检查行面板时getPreferredSize().width/height,我得到了不同的值: 对于getPrefereedSize().width,我得到了我真正设置的宽度,但是对于getWidth()我得到了一个明显较低的值。两种方法之间有区别getWidth()吗getPreferredSize().width?
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

还有一些关于getSize()and的其他问题getPreferredSize(),但我没有找到可以被视为重复的问题。所以开始了...)

Swing 中的组件通常有一个首选大小。这是调用该方法时返回的大小getPreferredSize。它是组件“想要”的大小,以便正确显示。例如,JLabel具有特定文本和字体的 a 将具有刚好足以显示整个文本的首选大小。

但是当一个组件显示在屏幕上时,可能无法以其首选大小显示它(一些原因将在下面解释)。因此在调用时getSize,该方法将返回组件当前在屏幕上的实际大小。当包含框架调整大小时,组件也可能调整大小,然后再次返回不同的值。

(请注意,getSize()基本上返回一个对象,该对象包含与getWidth()and返回的值相同的值getHeight())。


为什么不能始终确保实际尺寸与首选尺寸匹配:

Swing 中的布局通常由布局管理器处理。详细信息在有关在容器中布置组件的教程中进行了说明,但我将在此处尝试总结与此问题相关的部分。

这样的布局管理器将尝试以其首选大小布置组件。可以想象这是困难的,有时甚至是不可能的。想象一个GridLayout(1,2)包含两个其他面板的面板:

+---------------------+---------------------+

|                     |                     |

|  Preferred Size:    |   Preferred Size    |

|     400 x 300       |      100 x 200      |

|                     |                     |

+---------------------+---------------------+

在 中GridLayout,所有组件的大小必须相同。但他们的首选尺寸不同。所以布局管理器根本无法确保面板的实际尺寸与其首选尺寸相同。因此它以介于两者之间的折衷大小显示它们。(它还可能考虑到最小和最大尺寸,使其更加困难......)。最后,两个面板的大小可能是(例如)(300,200)像素,即使首选大小是(400,300)和(100,200)像素。


特别是关于您描述的布局:请注意,FlowLayout这里有点特别。如果有足够的空间,它将以首选大小布置组件。如果没有足够的空间,则某些组件可能不可见。因此,您可以尝试将行中的 更改FlowLayout为 a GridLayout(1,n),其中n是该行中的键数。


查看完整回答
反对 回复 2023-05-17
?
慕少森

TA贡献2019条经验 获得超9个赞

组件的 getWidth/getHeight 返回当前尺寸。getPreferredSize 返回组件想要获取的内容。例如,带有文本的按钮将返回首选大小,因此文本将完全可见。

合理的布局管理器会向子组件询问它们的首选尺寸,并为它们提供这些尺寸。这将导致父组件的首选大小。如果将父组件设置为较小的尺寸,则它不能再强制执行子组件的首选尺寸,并且要么隐藏一些组件,要么使组件变小。


查看完整回答
反对 回复 2023-05-17
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信