Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getWidth()/getHeight()和getPreferredSize().width/height之间有什么区别?_Java_User Interface_Dimension_Preferredsize - Fatal编程技术网

Java getWidth()/getHeight()和getPreferredSize().width/height之间有什么区别?

Java getWidth()/getHeight()和getPreferredSize().width/height之间有什么区别?,java,user-interface,dimension,preferredsize,Java,User Interface,Dimension,Preferredsize,我正在尝试用在调整JFrame大小时动态调整大小的键绘制键盘。此外,钥匙可以有不同的尺寸 我有一个面板,其布局设置为BorderLayout。在中间我放置了一个面板,其布局设置为GridLayout(5,1) 网格的每一行都是一个JPanel,带有FlowLayout。在每一行中,我都在计算每个按钮,并通过调用setPreferredSize方法来设置其首选大小 在运行程序时,我只看到一些外观怪异的按钮。当我用getWidth()/getHeight()和getPreferredSize().w

我正在尝试用在调整JFrame大小时动态调整大小的键绘制键盘。此外,钥匙可以有不同的尺寸

我有一个面板,其布局设置为
BorderLayout
。在中间我放置了一个面板,其布局设置为
GridLayout(5,1)

网格的每一行都是一个
JPanel
,带有
FlowLayout
。在每一行中,我都在计算每个按钮,并通过调用
setPreferredSize
方法来设置其首选大小

在运行程序时,我只看到一些外观怪异的按钮。当我用
getWidth()/getHeight()
getPreferredSize().width/height
检查行面板时,我得到了不同的值:对于
getPreferedSize().width
,我得到的是我真正设置的宽度,但是对于
getWidth()
我得到的值要低得多


这两种方法之间是否存在差异,
getWidth()
getPreferredSize().width

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

合理的布局管理器会询问子组件的首选尺寸,并给出这些尺寸。这将导致父零部件的首选尺寸。如果父组件被设置为更小的大小,它将无法再强制子组件的首选大小,或者隐藏一些组件,或者使组件更小。

(这个问题有一个对应的问题:。还有一些关于
getSize()
getPreferredSize()的其他问题)
,但我没有找到一个可以被认为是重复的。所以我们开始…)

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

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

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


为什么不总是可能确保实际尺寸与首选尺寸匹配:

Swing中的布局通常由布局管理器处理。教程中对细节进行了解释,但我将尝试在这里总结与此问题相关的部分

此类布局管理器将尝试以其首选尺寸布局组件。可以想象,这是困难的,有时甚至是不可能的。想象一个带有
网格布局(1,2)
的面板,其中包含两个其他面板:

+---------------------+---------------------+
|                     |                     |
|  Preferred Size:    |   Preferred Size    |
|     400 x 300       |      100 x 200      |
|                     |                     |
+---------------------+---------------------+
在网格布局中,所有组件的大小必须相同。但是他们喜欢的尺寸是不同的。因此,布局管理器无法确保面板的实际尺寸与其首选尺寸相同。因此,它显示它们的大小是两者之间的折衷。(它还可能考虑到最小和最大尺寸,使其更加困难…)。最后,两个面板的大小例如可以是(300200)像素,即使优选大小已经是(400300)和(100200)像素



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

对相应文档的一些引用会更好我希望这就是您的意思:和@Thomas,我有一些我不确定是否理解的问题:1.在哪种情况下getWidth/Height的值与getPreferredSize.getWidth/Height的值相同?2.您能解释一下“如果父组件设置为较小的尺寸,……它会隐藏一些组件或使组件变小”中的意思吗?您的意思是子组件设置的首选尺寸不会是实际尺寸吗?3.您说过“这将导致父组件的首选大小”,因此如果父组件大小将发生更改,这是否意味着父容器将足够大,足以容纳其所有重新计算的子组件?我已经重写了我的帖子,所以也许这会让情况变得更清楚不幸的是gridLayout在这里帮不了我,因为键可以有不同的大小。一个可以比另一个大1.5,1.75,2倍。因此,我不得不对键盘中的每一行使用FlowLayoud。您是否已经阅读了这些方法的文档?:)每次提出问题时,请张贴演示问题的帖子。谢谢。回答得很好。。我将挑战性地阅读附在您回复中的教程。关于您所说的(“将FlowLayout更改为GridLayout”),当没有足够的空间放置组件时,此布局的行为是否与FlowLayout不同?此外,您是否可以假设为什么我没有获得正在尝试的绘制?我是否应该调用一些容器验证方法?当应用程序启动时,我只看到部分键盘,但所有键盘都是混合的(例如,Tab和Shift位于sam处)