前回までに作成したUpperHand GameをApplet Viewerで実行して、
ウィンドウのサイズを変更してみてください。
コンポーネントがすべて左上に詰められて表示されるはずです。
これはApplet内の座標指定でコンポーネントを配置したためです。
今回はコンポーネントをAppletの中央に配置するように修正します。
コンポーネントを配置するにはレイアウトマネージャを使用します。 JDK1.0.2には以下のレイアウトマネージャが用意されています。
BorderLayout
クラス
"North"
、"South"
、
"West"
、"East"
、
"Center"
という文字列で指定する。
FlowLayout
クラス
GridLayout
クラス
GridBagLayout
クラス
GridBagConstraints
クラスのインスタンスで指定された「制約」にしたがい
コンポーネントを左から右、上から下へ順に配置する。
各コンポーネントは同じ大きさである必要はないし、
複数の行/列を占めるコンポーネントも指定できる。
CardLayout
クラス
コンテナが使用するレイアウトマネージャは、Container
クラスの
setLayout()
メソッドで指定します。
レイアウトマネージャ指定後、Container
クラスの
add()
メソッドでコンポーネントを追加すると、
指定されたレイアウトマネージャにしたがった配置がなされます。
UpperHand GameではGridBagLayout
クラスを使用します。
レイアウトマネージャはコンポーネントを配置するときに
そのコンポーネントの「推奨サイズ」と「最小サイズ」を使用します。
推奨サイズ、最小サイズはComponent
クラスの
preferredSize()
メソッド、minimumSize()
メソッドを
オーバーライドして定義します。
preferredSize()
、minimumSize()
はJDK1.1では推奨されないメソッドとなっています。
以下は、UpperHandBoardView
クラスの
preferredSize()
、minimumSize()
の実装です。
//----------------------------------------------------------------------------- // public Dimension minimumSize() // コンポーネントの最小サイズを返す。 //----------------------------------------------------------------------------- public Dimension minimumSize() { return new Dimension(size * 5, size * 5); } //----------------------------------------------------------------------------- // public Dimension preferredSize() // コンポーネントの推奨サイズを返す。 //----------------------------------------------------------------------------- public Dimension preferredSize() { return minimumSize(); }
以下は、UpperHandBallView
クラスの
preferredSize()
、minimumSize()
の実装です。
//----------------------------------------------------------------------------- // public Dimension minimumSize() // コンポーネントの最小サイズを返す。 //----------------------------------------------------------------------------- public Dimension minimumSize() { return new Dimension(size * width, size * height); } //----------------------------------------------------------------------------- // public Dimension preferredSize() // コンポーネントの推奨サイズを返す。 //----------------------------------------------------------------------------- public Dimension preferredSize() { return minimumSize(); }
以下は、UpperHandPlayerView
クラスの
preferredSize()
、minimumSize()
の実装です。
//----------------------------------------------------------------------------- // public Dimension minimumSize() // コンポーネントの最小サイズを返す。 //----------------------------------------------------------------------------- public Dimension minimumSize() { return new Dimension(0, 16); } //----------------------------------------------------------------------------- // public Dimension preferredSize() // コンポーネントの推奨サイズを返す。 //----------------------------------------------------------------------------- public Dimension preferredSize() { return minimumSize(); }
UpperHandPlayerView
クラスの横幅の最小値は0としています。
これは、UpperHandBallView
クラスの横幅にあわせるためです。
GridBagLayout
クラスを使ってコンポーネントを配置するときには、
コンポーネントごとの「制約」を定義した
GridBagConstraints
クラスの
インスタンスを作成する必要があります。
制約はGridBagConstraints
オブジェクトの以下のインスタンス変数に
値を設定することで指定します。
gridx
, gridy
gridwidth
, gridheight
REMAINDER
を指定すると、
残りの列幅/行幅をすべて指定したことになります。
fill
ipadx
, ipady
insets
anchor
weightx
, weighty
コンポーネントと制約の対応づけは、GridBagLayout
クラスの
setConstraints()
メソッドで行います。
では、コンポーネントを配置するために、UpperHand
クラスの
layoutComponent()
メソッドを実装しましょう。
//----------------------------------------------------------------------------- // private void layoutComponent() // コンポーネントを配置する。 //----------------------------------------------------------------------------- private void layoutComponent() { GridBagLayout layout = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); // レイアウトマネージャを設定する。 setLayout(layout); // ゲーム盤を表示するコンポーネントを配置する。 c.gridheight = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.NONE; layout.setConstraints(boardView, c); add(boardView); // 以降のコンポーネントの配置方法を設定する。 c.gridheight = 1; c.gridwidth = GridBagConstraints.REMAINDER; c.anchor = GridBagConstraints.NORTH; // 先手のプレーヤーを表示するコンポーネントを配置する。 c.fill = GridBagConstraints.HORIZONTAL; layout.setConstraints(playerView[UpperHandGame.FIRST], c); add(playerView[UpperHandGame.FIRST]); // 先手の持ち玉を表示するコンポーネントを配置する。 c.fill = GridBagConstraints.NONE; layout.setConstraints(ballView[UpperHandGame.FIRST], c); add(ballView[UpperHandGame.FIRST]); // 後手のプレーヤーを表示するコンポーネントを配置する。 c.fill = GridBagConstraints.HORIZONTAL; layout.setConstraints(playerView[UpperHandGame.SECOND], c); add(playerView[UpperHandGame.SECOND]); // 後手の持ち玉を表示するコンポーネントを配置する。 c.fill = GridBagConstraints.NONE; layout.setConstraints(ballView[UpperHandGame.SECOND], c); add(ballView[UpperHandGame.SECOND]); }
GridBagConstrains
オブジェクトを1つだけ生成し、
すべてのコンポーネントの制約の設定に使っています。
各コンポーネントでGridBagConstrains
オブジェクトのデフォルト値を変更している部分について説明します。
UpperHandBoardView
オブジェクト
gridheight
に定数REMAINDER
を指定。fill
に定数NONE
を指定。
UpperHandPlayerView
オブジェクト
gridwidth
に定数REMAINDER
を指定。anchor
に定数NORTH
を指定。fill
に定数HORIZONTAL
を指定。
UpperHandBallView
オブジェクト
gridwidth
に定数REMAINDER
を指定。anchor
に定数NORTH
を指定。fill
に定数NONE
を指定。
Javaソースコード (Ver. 1.1a6)