[Next] [Prev] [Back] [Home]

■ UpperHand Gameを作る


ゲーム盤の表示エリアを分ける(その2)

前回までに作成したUpperHand GameをApplet Viewerで実行して、 ウィンドウのサイズを変更してみてください。 コンポーネントがすべて左上に詰められて表示されるはずです。 これはApplet内の座標指定でコンポーネントを配置したためです。
今回はコンポーネントをAppletの中央に配置するように修正します。

レイアウトマネージャ

コンポーネントを配置するにはレイアウトマネージャを使用します。 JDK1.0.2には以下のレイアウトマネージャが用意されています。

BorderLayoutクラス
コンポーネントを上下左右、中央に配置する。 配置する位置は、 "North""South""West""East""Center" という文字列で指定する。
FlowLayoutクラス
コンポーネントを左から右へ順に配置する。 コンテナの横幅に入りきらないコンポーネントは次の行に配置される。 左詰め、右詰め、中央揃えの指定が可能。
GridLayoutクラス
コンテナを指定された数の(同じ大きさの)行と列に分割し、 コンポーネントを左から右、上から下へ順に配置する。
GridBagLayoutクラス
コンテナを行と列に分割し、GridBagConstraints クラスのインスタンスで指定された「制約」にしたがい コンポーネントを左から右、上から下へ順に配置する。 各コンポーネントは同じ大きさである必要はないし、 複数の行/列を占めるコンポーネントも指定できる。
CardLayoutクラス
複数のコンポーネントのうち常に1つだけを表示するレイアウト。 コンポーネントを(カードをめくるように)切り替えるときに使用する。

コンテナが使用するレイアウトマネージャは、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
コンポーネントの列幅、行幅を指定します。デフォルト値は1です。 定数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に対応していません。

Javaソースコード (Ver. 1.1a6)



[Next] [Prev] [Back] [Home]
Satoshi Kobayashi (koba@yk.rim.or.jp)