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
是该行中的键数。
TA贡献2019条经验 获得超9个赞
组件的 getWidth/getHeight 返回当前尺寸。getPreferredSize 返回组件想要获取的内容。例如,带有文本的按钮将返回首选大小,因此文本将完全可见。
合理的布局管理器会向子组件询问它们的首选尺寸,并为它们提供这些尺寸。这将导致父组件的首选大小。如果将父组件设置为较小的尺寸,则它不能再强制执行子组件的首选尺寸,并且要么隐藏一些组件,要么使组件变小。
添加回答
举报