nullのレイアウト
Zオーダー
通常、Java言語でコンテナの上にコンポーネントを配置する場合
すでに用意されたレイアウトマネージャに、サイズや配置を任せます
コンテナのサイズ変更に柔軟に対応することができるたに、重要な機能でした
しかし、レイアウトマネージャを使わず手動でコンポーネントを配置することもできます
これにはnullのレイアウトマネージャを使用します
レイアウトマネージャを使用しない場合は、自分でコンポーネントのサイズや位置を設定します
当然ですが、コンポーネントのサイズ変更には対応できません
このことから、非プラットフォーム依存であるJavaにとって、あまり利点はありません
Java言語は、レイアウトのアルゴリズムを定義して、それをクラスにカプセル化するという
非常に汎用的な手法があることを忘れないでくださいね(これを ストラテジパターン と呼びます)
ただし、nullのレイアウトマネージャーにも適切な利用方法があります
まず、nullのレイアウトマネージャーを設定する場合は setLayout() メソッドでnullを指定し
コンテナに追加したコンポーネントは必ずsetSize() と setLocation() を設定します
import java.applet.Applet;
import java.awt.*;
/* <applet code="App64.class" width="300"height="300">
</applet>
*/
public class App64 extends Applet {
public void init() {
setLayout(null);
setBackground(Color.white);
Button but[] = new Button[5];
for(int i = 0 , d = 10 ; i < 5 ; i++) {
but[i] = new Button("Kitty " + i);
but[i].setLocation(d , d);
but[i].setSize(100 , 25);
add(but[i]);
d += 10;
}
}
}
ボタンをレイアウトマネージャなしに、自分で配置したアプレットです
上のアプレットは、コンポーネント同士が重なりあっているのが特徴ですね
このようなコンポーネントの重なる順序をZオーダーと言います
ZオーダーはAWT1.1以降から保証されています
AWT1.1以降では、必ず最初のコンポーネントを手前に、あとに追加されたコンポーネントを後ろにします
それ以前のバージョンでは、重なる順序(Zオーダー)は保証されません
nullのレイアウトマネージャは、カスタムコンポーネントなどのオブジェクトをランダムに配置したり
それをD&Dで移動させたりするプログラムに適切と言えますが
通常のコンポーネントの配置をレイアウトマネージャを使わないで行うのは間違いとされます
setSize()メソッドと、setLocation()メソッドの両方の機能を持つ
setBounds()メソッドというのも、Componentクラスに用意されています
上のアプレットのような処理の場合は、こちらを使ったほうが早いですね
public void setBounds( int x, int y, int width, int height )
public void setBounds( Rectangle r )
xとyには、コンポーネントの開始座標を
widthとheightには、コンポーネントの横と高さのサイズを指定します
rにはコンポーネントの境界を表す長方形を指すRectangleオブジェクトを渡します
import java.applet.Applet;
import java.awt.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
public void init() {
setLayout(null);
setBackground(Color.white);
Button but[] = new Button[5];
for(int i = 0 , d = 10 ; i < 5 ; i++) {
but[i] = new Button("Kitty " + i);
but[i].setBounds(d , d , 100 , 30);
add(but[i]);
d += 10;
}
}
}