コンテナ内にコンポーネントを配置する |
ここでもう一度、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; //行の最後
わかりやすくするため、GridBagLayout が処理するコンポーネントごとの制約をすべてテーブルに示す。 既定値でない値はボールド書体で示す。前のテーブルエントリと異なる値はイタリック書体で示す。c.gridwidth = 1; //既定値へリセット
コンポーネント 制約 ------------- ----- すべてのコンポーネント 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 が占める一番下の行に割り当てることになる。
コンテナ内にコンポーネントを配置する |