コンテナ内にコンポーネントを配置する |
レイアウトマネージャを使用しないよう Container に明示的に指示しないかぎり、 Container はその Container 独自のレイアウトマネージャのインスタンスと結び付けられる。 このレイアウトマネージャは、Container が外観を変化させる必要が生じるたびに、自動的に参照される。ほとんどのレイアウトマネージャのメソッドは、それを直接呼び出すためのプログラムを必要としない。レイアウトマネージャの選択方法
AWT 提供のレイアウトマネージャには、それぞれ長所と短所がある。このセクションでは、一般的な配置のシナリオと、どの AWT レイアウトマネージャがそれぞれのシナリオに適しているかについて説明する。状況に適した AWT レイアウトマネージャがない場合は、PackerLayout のような、ネットワークに提供されているレイアウトマネージャを使ってもかまわない。
- シナリオ: 利用可能なスペースいっぱいにコンポーネントを表示しなくてはならない。
- BorderLayout か GridBagLayout の使用を検討する。 BorderLayout を使用する場合は、スペースを多く使うコンポーネントを中央領域に配置する必要が生じる。GridBagLayout では、そのコンポーネントに対して
fill=GridBagConstraints.BOTH
という制約を設定する必要がある。または、同じコンテナにあるコンポーネントすべてがスペースを多く使うコンポーネントと同じ大きさになってもかまわないのなら、GridLayoutを使用することもできる。シナリオ: いくつかのコンポーネントをコンパクトな行の中に自然なサイズで表示しなくてはならない。 コンポーネントの保持に Panel を使用すること、および Panel のデフォルトであるFlowLayoutマネージャを使用することを検討する。 シナリオ: 複数の行か列、またはその両方に同じサイズのコンポーネントをいくつか表示しなくてはならない。 この目的には GridLayout が最適である。 レイアウトマネージャを作成し、コンテナと結び付ける方法
すべてのコンテナにはデフォルトのレイアウトマネージャが結び付けられる。すべての Panel (Applet も含む) は FlowLayout を使用するよう初期化される。すべての Window (FileDialog のような特殊目的のものを除く) は BorderLayout を使用するよう初期化される。Container のデフォルトのレイアウトマネージャを使用したい場合は、何もする必要はない。各 Container の構築子がレイアウトマネージャのインスタンスを作成し、それを使用するよう Container を初期化するからである。
デフォルト以外のレイアウトマネージャを使用するには、望みのレイアウトマネージャクラスのインスタンスを作成し、それを使用するよう Container に指示する必要 がある。以下に、これを行う典型的なコードを示す。このコードは CardLayout マネージャを作成し、それを Container のレイアウトマネージャとしてセットアップするものである。
aContainer.setLayout(new CardLayout());レイアウトマネージャを使用するときの経験則
Container のレイアウトマネージャへの呼び出しを伴う Container メソッドには、add()
、remove()
、removeAll()
、layout()
、preferredSize()
、minimumSize()
がある。add()
、remove()
、removeAll()
メソッドは Container に対してコンポーネントの追加および 削除を行う。これらはいつでも呼び出すことができる。layout()
メソッドは Container へのペイント要求の結果として呼び出され、Container の位置とサイズ自体、および Container が含む Component の情報を必要とする。このメソッドは通常、ユーザから直接呼び出されることはない。preferredSize()
とminimumSize()
メソッドはそれぞれ、Container の理想的なサイズと最小サイズを返す。 ただし、返される値はヒントに過ぎず、プログラムでこのようなサイズを実際に使用しないかぎり、何の影響も及ぼさない。Container の
preferredSize()
とminimumSize()
メソッドを呼び出すときは、特別な注意が必要である。 これらのメソッドが返す値は、Container とその Component が正しいピアオブジェ クトをもっていなければ意味がないからである。ピアが作成されるときの情報については、コンポーネントのアーキテクチャの詳細 を参照する。
コンテナ内にコンポーネントを配置する |