軽量コンポーネント


ピアのないコンポーネント

軽量コンポーネントは、簡単に説明するならば
Componentクラスを拡張したカスタムコンポーネントのことをいいます

これに対し、PanelクラスやCanvasクラスを拡張したカスタムコンポーネントを
軽量コンポーネントに対して重量コンポーネントと呼びます
重量コンポーネントの生成はいたって単純で、Canvasクラスなどを拡張したクラスを作成すればよいのです
たとえば、画像を用いたボタンなどのコンポーネントは、この方法を用いますね

軽量コンポーネントは、重量コンポーネントと違いピアを持ちません
また、レンタリングにネイティブのウィンドウを必要としないため「軽量」と呼ばれます
その代わり、軽量コンポーネントはコンテナのウィンドウに描画されます

軽量コンポーネントの最大の魅力は背景を持たないことです
背景を持つ重量コンポーネントの場合、必ずコンポーネントの形は長方形でした
しかし、背景を持たない軽量コンポーネントは背景を透過します
これは、背景とキャラクターをかさね、キャラクターを動かすなどの処理に有効ですね

軽量コンポーネントの作成には2点注意があります
1つはpaint()メソッドのオーバーライドです
軽量コンポーネントを用いる他の重量コンポーネントでは
paint()メソッドをオーバーライドする場合、スーパークラスのpaint()メソッドを呼び出さなくてはなりません
これは、軽量コンポーネントを描画するのがContainer.paint()だからです

もう一つの注意点は、軽量コンポーネントクラスは
自分自身の推奨サイズを返すメソッドをオーバーライドするということです
ComponentクラスのgetPreferredSize()メソッドをオーバーライドします

public Dimension getPreferredSize()

このメソッドは、コンポーネントの最適サイズを表すDimensionオブジェクトを返します
この情報を用いて描画するコンポーネントのサイズが決定されます
もちろん、サイズはレイアウトマネージャが決めるので、必ずしもそのサイズになるとは限りません
しかし、軽量コンポーネントはデフォルトで1ピクセルの正方形なので
getPreferredSize()メソッドをオーバーライドするべきです
import java.applet.Applet;
import java.awt.*;

/*	<applet code="App63.class" width="300"height="300">
 	</applet>
*/

public class App63 extends Applet {
	public void init() {
		setBackground(Color.black);
		Lcomponent lcom = new Lcomponent("Kitty on your lap");
		add(lcom);
	}
	public void paint(Graphics g) {
		g.setColor(Color.blue);
		g.drawString("Kitty on your lap" , 100 , 100);
		super.paint(g);
	}
}

class Lcomponent extends Component {
	Dimension dim;
	String str;
	Font font = new Font("Serif" , Font.BOLD , 30);

	public Lcomponent(String str) {
		this.str = str;
		setFont(font);
		FontMetrics fm = getFontMetrics(getFont());
		dim = new Dimension(fm.stringWidth(str) + 10 , fm.getHeight() + 10);
	}

	public void paint(Graphics g) {
		g.setColor(Color.red);
		g.setFont(font);
		g.drawString(str , 5 , dim.height - 10);
	}

	public Dimension getPreferredSize() {
		return dim;
	}
}
アプレット

赤い文字が軽量コンポーネントで、青い文字がアプレットの文字です
軽量コンポーネントの場合、このようにコンテナのウィンドウに描画されます
軽量コンポーネントは値がnullの状態であることが多いので、できるだけ詳細に設定します
背景のないコンポーネントは透過gifなどを用いた時も、威力を発揮します


軽量コンテナ

軽量コンポーネント同様に、コンテナを拡張したものを軽量コンテナといいます
軽量コンテナはCantainerクラスを拡張したクラスで
実装方法は軽量コンポーネントとまったく同じです

ただし、軽量コンテナの場合は軽量コンポーネントの注意点に加え
レイアウトマネージャのことでもう1点注意が必要です
Containerクラスは、Componentクラスに加え、add(Component c)メソッドがあります

実は、軽量コンテナのレイアウトマネージャはデフォルトでnullです
この状態では、追加されたコンポーネントを手作業で配置しなくてはなりません
軽量コンテナの場合はsetLayout()でレイアウトマネージャを設定する必要があるのです
import java.applet.Applet;
import java.awt.*;

/*	<applet code="test.class" width="300"height="300">
 	</applet>
*/

public class test extends Applet {
	public void init() {
		setBackground(Color.black);
		Lcontainer lcom = new Lcontainer("Kitty on your lap");
		lcom.add(new Button("Kitty"));
		add(lcom);
	}
	public void paint(Graphics g) {
		g.setColor(Color.blue);
		g.drawString("Kitty on your lap" , 100 , 100);
		super.paint(g);
	}
}

class Lcontainer extends Container {
	Dimension dim;
	String str;
	Font font = new Font("Serif" , Font.BOLD , 30);

	public Lcontainer(String str) {
		this.str = str;
		setFont(font);
		setLayout(new FlowLayout());
		FontMetrics fm = getFontMetrics(getFont());
		dim = new Dimension(fm.stringWidth(str) + 10 , fm.getHeight() + 50);
	}

	public void paint(Graphics g) {
		g.setColor(Color.red);
		g.setFont(font);
		g.drawString(str , 5 , dim.height - 10);
	}

	public Dimension getPreferredSize() {
		return dim;
	}
}
Lcontainer()コンストラクタ内で、setLayout()メソッドが呼び出されています
ここでレイアウトマネージャを設定しなければ、デフォルトでnullになります
nullの状態では、ボタンが表示されないことを確認してください



前のページへ戻る次のページへ