前回までに作成した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)