2012-04-14 4 views
1

私は、さまざまなLayoutManagersを適切に使用して、自分のGUI設計スキルをより効率的かつ効果的にするために、フードの下で何が起こっているのかを詳細に理解して頭を上げようとしています。私はBorderLayoutのソースを見ていますが、layoutContainer()メソッドから取得したコードスニペットでは、子コンポーネントのsetSize()メソッドの後にsetBounds()が呼び出されます。これらのComponentメソッドのソースを見ると、setSize()は実際にはsetBounds()をComponent.xとComponent.yの現在の値で呼び出します。なぜこれが行われますか(そして完全に還元されるわけではありません)? setBounds()コールはsetSize()コールの結果を完全に上書きしませんか?Java:setSize()の後にsetBounds()を呼び出すBorderLayoutはなぜですか?

if ((c=getChild(NORTH,ltr)) != null) { 
    c.setSize(right - left, c.height); 
    Dimension d = c.getPreferredSize(); 
    c.setBounds(left, top, right - left, d.height); 
    top += d.height + vgap; 
} 

ありがとう。

答えて

1

一部のコンポーネントは、優先サイズを計算する際に、現在のサイズを考慮に入れます。たとえば、テキスト領域は、それがどれほど広いかを知るまでは、どれくらいの高さになりたいのか分かりません。テキストラッピングを行い、必要な行数を調べることができます。

ここでsetSize()を呼び出すと、実際に幅を指定するだけです。次に、レイアウトマネージャは、その幅に対して、好ましい高さのを取得して設定します。

+0

素晴らしい!それは完璧な意味合いがあります。 「通常の」インターフェースの下で何が起こっているのかを完全に理解するには、長い時間がかかります。ありがとう。 – ags

関連する問題