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 返回組件想要獲取的內容。例如,帶有文本的按鈕將返回首選大小,因此文本將完全可見。
合理的布局管理器會向子組件詢問它們的首選尺寸,并為它們提供這些尺寸。這將導致父組件的首選大小。如果將父組件設置為較小的尺寸,則它不能再強制執行子組件的首選尺寸,并且要么隱藏一些組件,要么使組件變小。
添加回答
舉報