レイアウトマネージャ
フローレイアウト
大体、代表的なコンポーネントの作成方法はわかりました
しかし、このままでは綺麗な意図したレイアウトを実現できません
やはり、それぞれの部品は見た目的にもすっきりした配置にしたいのが人情です
ですが、Javaでは正確な位置を全体サイズから計算して配置するようなことはしません
なぜならば、コンポーネントはプラットフォームによって異なるためです
そこで、レイアウトに関しては抽象的で相対的な位置付けを行い、
それを配置するアルゴリズムはプラットフォームのJVMにゆだねられるというわけです
レイアウトの設定はContainerクラスのsetLayout()メソッドで行います
public void setLayout( LayoutManager mgr )
パラメータmgrに指定するのはjava.awt.LayoutManagerインターフェイスです
このレイアウトマネージャこそが、コンポーネントの位置を決定するのです
まず、ここではjava.awt.FlowLayoutクラスを使用します
このクラスはObjectクラス下でLayoutManegerインタフェイスをインプリメントしています
次のコンストラクタでインスタンス化します
public FlowLayout()
public FlowLayout( int align )
public FlowLayout( int align, int hgap, int vgap )
パラメータに何も指定しなかった場合は、デフォルトの5単位の間隔で中央に配置します
alignには配置位置を指定する定数を指定します
hgapは縦、vgapには横の間隔を数値で指定します
配置位置を指定する定数は、同クラスで定義されています
コンストラクタのalignで指定できるのは、以下のいずれかの定数だけです
public static final int CENTER | 中央揃え
|
public static final int LEFT | 左揃え
|
public static final int RIGHT | 右揃え
|
public static final int LEADING | リーディングエッジ
|
public static final int TRAILING | リーディングエッジ
|
最後の二つの定数はJDK1.2以降の国際用アプリケーションで使用されます
よって今は使う必要もないので説明しません
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
public void init() {
setBackground(Color.white);
setLayout(new FlowLayout(FlowLayout.CENTER , 5 , 20));
for (int i = 0 ; i < 10 ; i++) add(new Button("ボタン " + i ));
}
}
これをアプレットビューワで実行してください
サイズを変更すると、それにあわせて適確なレイアウトが施されます
行からはみ出る場合は、ボタンが改行されます
このフローレイアウトはボタンの配置に用いられることが多いです
ボーダーレイアウト
よく、アプレットのレイアウトのサンプルとして見る(?)のがボーダーレイアウトです
このレイアウトは、コンポーネントの配置位置を上下左右中央に指定します
これをサポートするクラスはjava.awt.BorderLayoutクラスです
このクラスはjava.awt.LayoutManager2インターフェイスをインプリメントしています
LayoutManeger2インタフェイスは、LayoutManegerインタフェイスを継承しているインタフェイスです
BorderLayoutクラスは次のコンストラクタを持ちます
public BorderLayout()
public BorderLayout( int hgap, int vgap )
hgapとvgapは、縦と横の間隔を指定します
指定しなかった場合は、隙間のないレイアウトになります
生成されるコンポーネントを、コンテナのどの位置に配置するかは
Containerクラスのadd()メソッドの次のシグネチャで指定します
public void add( Component comp, Object constraints )
constraintsには、配置位置の制約を表すオブジェクトを指定します
この場合はBorderLayoutクラスの定数を渡します
BorderLayoutクラスで定義されている制約用の定数は次のとおりです
public static final String CENTER | 中央
|
public static final String EAST | 左部
|
public static final String NORTH | 上部
|
public static final String SOUTH | 下部
|
public static final String WEST | 右部
|
実はこの定数はJDK1.2の段階では、もろに名前が定義されています
つまり、BorderLayout.CENTER = "Center" です
だから、add(button_obj , "Center") とやっても意図どおりに表示されますが
将来的にJDKが定数の内容を変更するようなことがあれば、コードを書き換える必要が出てきてしまいます
定数が用意されているのなら、素直に定数で記述したほうが明らかに汎用的です
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
public void init() {
setBackground(Color.white);
setLayout(new BorderLayout());
add(new Button("Kitty") , BorderLayout.NORTH);
add(new Button("on") , BorderLayout.WEST);
add(new Button("your") , BorderLayout.EAST);
add(new Button("lap") , BorderLayout.SOUTH);
add(new Button("Kitty on your lap") , BorderLayout.CENTER);
}
}
これを実行すると、上下左右と中央にボタンが配置されます
非常に面白いレイアウトなので、ぜひ試してください
グリッドレイアウト
より実用的なレイアウトで、グリッドがあります
グリッドレイアウトは、HTMLでいうテーブルのような感覚のレイアウトになります
グリッドは、縦と横の行数を指定し
コンテナは指定されたグリッドのレイアウトにしたがってコンポーネントを配置します
グリッドはjava.awt.GridLayoutクラスを使用します
コンストラクタはのとおりです
public GridLayout()
public GridLayout( int rows, int cols )
public GridLayout( int rows, int cols, int hgap, int vgap )
何も指定しなかった場合は1つのコンポーネントが1列に並びます
rowsには行、colsには列を指定します
ここで0を指定すると任意の数のオブジェクトを1列または1行に配置できます
hgapとvgapは、それぞれ縦と横の間隔を指定します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
public void init() {
setBackground(Color.white);
setLayout(new GridLayout(5 , 2));
for (int i = 0 ; i < 10 ; i++) add(new Button("Kitty " + i));
}
}
このプログラムの場合は、ボタンが横に5列、縦に2行並びます
こうして決められた間隔で並べると、非常に整って見えます