コンテナ内にコンポーネントを配置する |
レイアウトマネージャを使わないようにすることは可能だが、できるだけレイアウトマネージャを使用する方が望ましい。レイアウトマネージャでは、コンテナのサイズ変更や、プラットフォームに依存するコンポーネントの外観および異なるフォントへの対応が簡単だからである。しかも、他のコンテナや他のプログラムから簡単に再利用することができる。絶対的な位置決めに意味があるのは、特製のコンテナが再利用される予定がなく、サイズ変更もされず、フォントサイズやコンポーネントの外観など通常はシステムに依存する因子を完全に制御する(必要があれば独自のコントロールを実装する)場合である。ここで、絶対的な位置決めを行うウィンドウを起動するアプレットを示す。
使用中のブラウザは 1.0 Java アプレットを実行することができない。したがってここではプログラムが起動するウィンドウの画像を示す。
以下に、インスタンス変数の宣言、構築子の実装と、ウィンドウクラスの paint()
メソッドの実装を示す。プログラム全体へのリンクも用意されている。このプログラムは、AppletButton を利用してアプレットの中で動作するか、またはアプリケーションとして動作する。
public class NoneWindow extends Frame { . . . private boolean laidOut = false; private Button b1, b2, b3; public NoneWindow() { super(); setLayout(null); setFont(new Font("Helvetica", Font.PLAIN, 14)); b1 = new Button("one"); add(b1); b2 = new Button("two"); add(b2); b3 = new Button("three"); add(b3); } public void paint(Graphics g) { if (!laidOut) { Insets insets = insets(); /* * paint() から呼び出された場合、insets() が有効な Insets を返すことは * 保証されている。 -- しかし、構築子から呼び出された場合の Insets は * 無効である。 * * これを ivar にキャッシュすることもできるはずだが、insets は * 変わる可能性があり、そのときは AWT がまったく新しい * Insets オブジェクトを作成するので、古い方は無効になってしまう。 */ b1.reshape(50 + insets.left, 5 + insets.top, 50, 20); b2.reshape(70 + insets.left, 35 + insets.top, 50, 20); b3.reshape(130 + insets.left, 15 + insets.top, 50, 30); laidOut = true; } } . . . }
コンテナ内にコンポーネントを配置する |