2 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
還有一些關(guān)于getSize()
and的其他問(wèn)題getPreferredSize()
,但我沒(méi)有找到可以被視為重復(fù)的問(wèn)題。所以開始了...)
Swing 中的組件通常有一個(gè)首選大小。這是調(diào)用該方法時(shí)返回的大小getPreferredSize
。它是組件“想要”的大小,以便正確顯示。例如,JLabel
具有特定文本和字體的 a 將具有剛好足以顯示整個(gè)文本的首選大小。
但是當(dāng)一個(gè)組件顯示在屏幕上時(shí),可能無(wú)法以其首選大小顯示它(一些原因?qū)⒃谙旅娼忉專R虼嗽谡{(diào)用時(shí)getSize
,該方法將返回組件當(dāng)前在屏幕上的實(shí)際大小。當(dāng)包含框架調(diào)整大小時(shí),組件也可能調(diào)整大小,然后再次返回不同的值。
(請(qǐng)注意,getSize()
基本上返回一個(gè)對(duì)象,該對(duì)象包含與getWidth()
and返回的值相同的值getHeight()
)。
為什么不能始終確保實(shí)際尺寸與首選尺寸匹配:
Swing 中的布局通常由布局管理器處理。詳細(xì)信息在有關(guān)在容器中布置組件的教程中進(jìn)行了說(shuō)明,但我將在此處嘗試總結(jié)與此問(wèn)題相關(guān)的部分。
這樣的布局管理器將嘗試以其首選大小布置組件??梢韵胂筮@是困難的,有時(shí)甚至是不可能的。想象一個(gè)GridLayout(1,2)
包含兩個(gè)其他面板的面板:
+---------------------+---------------------+
|? ? ? ? ? ? ? ? ? ? ?|? ? ? ? ? ? ? ? ? ? ?|
|? Preferred Size:? ? |? ?Preferred Size? ? |
|? ? ?400 x 300? ? ? ?|? ? ? 100 x 200? ? ? |
|? ? ? ? ? ? ? ? ? ? ?|? ? ? ? ? ? ? ? ? ? ?|
+---------------------+---------------------+
在 中GridLayout
,所有組件的大小必須相同。但他們的首選尺寸不同。所以布局管理器根本無(wú)法確保面板的實(shí)際尺寸與其首選尺寸相同。因此它以介于兩者之間的折衷大小顯示它們。(它還可能考慮到最小和最大尺寸,使其更加困難......)。最后,兩個(gè)面板的大小可能是(例如)(300,200)像素,即使首選大小是(400,300)和(100,200)像素。
特別是關(guān)于您描述的布局:請(qǐng)注意,FlowLayout
這里有點(diǎn)特別。如果有足夠的空間,它將以首選大小布置組件。如果沒(méi)有足夠的空間,則某些組件可能不可見(jiàn)。因此,您可以嘗試將行中的 更改FlowLayout
為 a?GridLayout(1,n)
,其中n
是該行中的鍵數(shù)。

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
組件的 getWidth/getHeight 返回當(dāng)前尺寸。getPreferredSize 返回組件想要獲取的內(nèi)容。例如,帶有文本的按鈕將返回首選大小,因此文本將完全可見(jiàn)。
合理的布局管理器會(huì)向子組件詢問(wèn)它們的首選尺寸,并為它們提供這些尺寸。這將導(dǎo)致父組件的首選大小。如果將父組件設(shè)置為較小的尺寸,則它不能再?gòu)?qiáng)制執(zhí)行子組件的首選尺寸,并且要么隱藏一些組件,要么使組件變小。
添加回答
舉報(bào)