ボーダーの共有


インスタンスの共有は可能か?

経験のあるプログラマであれば、ボーダーの共有を試みると思います
同一のボーダーを、コンポーネントの数にあわせて生成するのは
メモリの消費につながるし、管理も複雑になり、CPUにも負担がかかります

そこで、次のようなプログラムを作って実行してみます
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class Test extends JApplet {
	public void init() {
		JPanel panel1 = new JPanel();
		JPanel panel2 = new JPanel();

		Border border = new LineBorder(Color.BLUE);
		panel1.setBorder(border);
		panel2.setBorder(border);

		getContentPane().setLayout(new GridLayout(1 , 2));
		getContentPane().add(panel1);
		getContentPane().add(panel2);
	}
}
このプログラムは、二つのパネルに対して
同じボーダーのインスタンス border を設定しています
実際に、このプログラムは問題なく動作し、期待どおりの結果になります

しかし、プロパティを持つボーダーを共有するのは好ましくありません
例えば、TitledBorder などのように、ボーダーの設定を自由に変更できるタイプです
一方のコンポーネントの都合で、他のボーダー共有するコンポーネントにも影響がでてしまいます


ボーダーファクトリ

Swing がサポートするボーダーを、可能な限り共有したい場合
Swing が提供するボーダーファクトリクラスを通します

ボーダーファクトリは、ボーダーのインスタンスを管理するクラスです
このクラスは、可能な限りインスタンスを共有しようと試みますが
実装上、共有が無理である場合は一意のインスタンスを返します
ボーダーファクトリは javax.swing.BorderFactory で実装されています

public class BorderFactory extends Object

このクラスは、ボーダーインスタンスを返す静的メソッドのみが公開されています
例えば、直線ボーダーを返すメソッドは次のようなものがあります

public static Border createLineBorder(Color color)
public static Border createLineBorder(Color color , int thickness)

このメソッドは、シグネチャを見れば
明らかに LineBorder クラスのコンストラクタを呼び出していることが分かります
しかし、重要なのは共有可能であれば生成済みのインスタンスを返すということです

作成したインスタンスや、共有しているインスタンスはファクトリクラスが管理するため
これを利用するプログラマは、内部の動向に注目する必要はありません
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JPanel panel1 = new JPanel();
		JPanel panel2 = new JPanel();

		panel1.setBorder(BorderFactory.createLineBorder(Color.RED));
		panel2.setBorder(BorderFactory.createLineBorder(Color.BLUE));

		getContentPane().setLayout(new GridLayout(1 , 2));
		getContentPane().add(panel1);
		getContentPane().add(panel2);
	}
}
このプログラムは、二つの直線ボーダー付きのパネルを表示します
直線ボーダーは BorderFactory によって生成され、管理されています
Swing1.1 FCS では、斜影ボーダーとエッチングボーダーのみが共有対象ですが
将来の拡張などで、他のボーダーも共有可能になる可能性が高いため
Swing の標準ボーダーを利用する場合は BorderFactory を用いることが推奨されます



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