Previous | Next | Trail Map | Creating a User Interface | コンテナ内にコンポーネントを配置する


GridBagLayout の使用方法: アプレット例の説明

ここでもう一度、GridBagLayout が動作する様子がわかるアプレットを示す。


使用中のブラウザは 1.0 Java アプレットを実行することができない。したがってここではプログラムが起動するウィンドウの画像を示す。


以下に、GridBagLayout とそれが管理するコンポーネントを作成するコードを示す。(プログラム全体も参照できる。 このプログラムは、AppletButton を利用してアプレットの中で動作するか、またはアプリケーションとして動作する。)

protected void makebutton(String name,
                          GridBagLayout gridbag,
                          GridBagConstraints c) {
    Button button = new Button(name);
    gridbag.setConstraints(button, c);
    add(button);
}

public GridBagWindow() {
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();

    setFont(new Font("Helvetica", Font.PLAIN, 14));
    setLayout(gridbag);

    c.fill = GridBagConstraints.BOTH;
    c.weightx = 1.0;
    makebutton("Button1", gridbag, c);
    makebutton("Button2", gridbag, c);
    makebutton("Button3", gridbag, c);

    c.gridwidth = GridBagConstraints.REMAINDER; //行の最後
    makebutton("Button4", gridbag, c);

    c.weightx = 0.0;                   //既定値へリセット
    makebutton("Button5", gridbag, c); //新たな行

    c.gridwidth = GridBagConstraints.RELATIVE; //行の最後の次
    makebutton("Button6", gridbag, c);

    c.gridwidth = GridBagConstraints.REMAINDER; //行の最後
    makebutton("Button7", gridbag, c);

    c.gridwidth = 1;                      //既定値へリセット
    c.gridheight = 2;
    c.weighty = 1.0;
    makebutton("Button8", gridbag, c);

    c.weighty = 0.0;                   //既定値へリセット
    c.gridwidth = GridBagConstraints.REMAINDER; //行の最後
    c.gridheight = 1;                   //既定値へリセット
    makebutton("Button9", gridbag, c);
    makebutton("Button10", gridbag, c);
}

この例は、GridBagLayout が管理するすべてのコンポーネントに対して 1 つの GridBagConstraints インスタンスを使用している。各コンポーネントがコンテナに追加される直前に、このコードは GridBagConstraints オブジェクトで適切なインスタンス変数を設定する (または既定値へリセットする)。その後、setConstraints() メソッドを使用して、そのコンポーネントに対するすべての制約値を記録する。

たとえば、行の終わりにくるコンポーネントを追加する直前のコードは次のようになる。

c.gridwidth = GridBagConstraints.REMAINDER; //行の最後

また、その次のコンポーネントを追加する直前のコードは、(次のコンポーネントが行全体を使用しない場合) 同じインスタンス変数が既定値にリセットされる。

c.gridwidth = 1;                      //既定値へリセット

わかりやすくするため、GridBagLayout が処理するコンポーネントごとの制約をすべてテーブルに示す。 既定値でない値はボールド書体で示す。前のテーブルエントリと異なる値はイタリック書体で示す。

コンポーネント                   制約
-------------                   -----
すべてのコンポーネント           gridx = GridBagConstraints.RELATIVE
                                gridy = GridBagConstraints.RELATIVE
                                fill = GridBagConstraints.BOTH
                                ipadx = 0, ipady = 0
                                insets = new Insets(0,0,0,0)
                                anchor = GridBagConstraints.CENTER

Button1, Button2, Button3       gridwidth = 1
                                gridheight = 1
                                weightx = 1.0
                                weighty = 0.0

Button4                         gridwidth = GridBagConstraints.REMAINDER
                                gridheight = 1
                                weightx = 1.0
                                weighty = 0.0

Button5                         gridwidth = GridBagConstraints.REMAINDER
                                gridheight = 1
                                weightx = 0.0
                                weighty = 0.0

Button6                         gridwidth = GridBagConstraints.RELATIVE
                                gridheight = 1
                                weightx = 0.0
                                weighty = 0.0

Button7                         gridwidth = GridBagConstraints.REMAINDER
                                gridheight = 1
                                weightx = 0.0
                                weighty = 0.0

Button8                         gridwidth = 1
                                gridheight = 2
                                weightx = 0.0
                                weighty = 1.0

Button9, Button10               gridwidth = GridBagConstraints.REMAINDER
                                gridheight = 1
                                weightx = 0.0
                                weighty = 0.0

このコンテナのすべてのコンポーネントは、与えられた行と列のもとで、できるだけ大きくなる。 この振る舞いは、プログラムが GridBagConstraints の fill インスタンス変数を GridBagConstraints.BOTH に設定し、すべてのコンポーネントをこの設定にすることによって実現されている。 プログラムが fill を指定しなければ、ボタンは次のようにそのままのサイズで表示 される。

このプログラムには複数の列にスパン化されるコンポーネントが 4 つ (Button5、 Button6、Button9、Button10) と、複数の行にスパン化されるコンポーネントが 1 つ (Button 8) ある。 この中で、コンポーネントの高さまたは幅が明示的に指定されているのは 1 つだけ (Button 8) である。他のコンポーネントはすべて、幅がGridBagConstraints.RELATIVE または GridBagConstraints.REMAINDER で指定されており、その行の他のコンポーネントのサイズを考慮しながら GridBagLayout がコンポーネントのサイズを決定する。

このプログラムが起動するウィンドウを大きくすると、それに伴って列の幅が等しく大きくなることがわかる。これは、1 行目にある各コンポーネント (1 行目ではどのコンポーネントも 1 列分の幅である) が weightx = 1.0 をもっているためである。コンポーネントの重みにとって、weightx の実際の値は重要でない。重要なのは、すべてのコンポーネント (とすべての列) が 1 より大きい重みを等しくもっていることである。GridBagLayout が管理するコンポーネントに weightx が設定されているものがない場合は、コンポーネントのコンテナが大きくされると、コンポーネントは次のようにコンテナの中央部にかたまったまま残る。

ウィンドウを大きくすると、最後の行の高さだけが高くなることもわかる。これは、Button8 だけがゼロより大きい weighty をもっているからである。 Button8 は 2 つの行にスパン化され、GridBagLayout は Button8 のすべての重みを Button8 が占める一番下の行に割り当てることになる。


Previous | Next | Trail Map | Creating a User Interface | コンテナ内にコンポーネントを配置する