アイコン


Swingのアイコン

Swing のアイコンは、ネイティブな画像形式に関連付けられることなく
徹底した抽象化による設計を十分に生かした、すばらしいデザインになっています

アイコンを用いる理由は、多くの Swing コンポーネントが
アイコンに関連したプロパティを用意し、ユーザーインタフェイスに影響を与えます
例えば、メニューやボタンにはそれが何を意味するかを示す絵があっても良いでしょう
Swing は、こういった画像の設定をアイコンを用いて行います

アイコンは javax.swing.Icon インターフェイスを用います
このインターフェイスは次のように宣言されています

public interface Icon

このインターフェイスは、アイコンのサイズと描画機能を提供しています
高さは Icon.getIconHeight() が、幅は Icon.getIconWidth() メソッドが返します

public int getIconWidth()
public int getIconHeight()

それぞれ、このアイコンの幅と高さを返します
アイコンの描画は Icon.paintIcon() メソッドが担当します
この構造は、ボーダーの描画機構と極めて似ています

public void paintIcon(Component c , Graphics g , int x , int y)

c にはアイコンを描画するコンポーネントを、g には描画対象の Graphics を
x にはアイコンの左上隅の X 座標、y には Y 座標を指定します

Icon を実装するクラスはこれらのメソッドを実装します
paintIcon はアイコンの描画が要求されたときに呼び出されます
開発者は渡された Graphics や Component のインスタンスを使ってアイコンを描画します
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void paint(Graphics g) {
		Icon icon = new FillIcon(Color.BLUE , 100 , 100);
		icon.paintIcon(this , g , 10 , 10);
	}
}

class FillIcon implements Icon {
	int width , height;
	Color color = Color.BLACK;
	public FillIcon(Color color , int width , int height) {
		this.color = color;
		this.width = width;
		this.height = height;
	}
	public int getIconWidth() { return width; }
	public int getIconHeight() { return height; }
	public void paintIcon(Component c , Graphics g , int x , int y) {
		g.setColor(color);
		g.fillRect(x , y , width , height);
	}
}


このプログラムを実行すると、四角形の単色のアイコンが表示されます
アイコンといっても、プログラムを見ると描画処理も何もかもがハードコーディングされ
特にこれといって目新しいものが感じられませんが、この設計が重要です

描画に関連した処理も直接コーディングできるため
事実上、画像でもプログラム的にでもアイコンを作成することができます
問題はそこではなく Icon インターフェイスを用いた抽象化によって
多くの Swing コンポーネントが Icon をサポートすることができることです

コンポーネントは、Icon インターフェイスからサイズを取得し
コンポーネントの適切な位置に Icon を描画しようと試みるでしょう
コンポーネント設計者はアイコンの実装の仕様を気にする必要はまったくありませんし
アイコンの開発者は、アイコンがどこでどう利用されるかについて考える必要はありません
これは、オブジェクト指向において理想的な関係です


イメージアイコン

上記した機能が理解できれば、画像ファイルを使ったアイコンも実装できます
しかし、Swing は Icon を実装した画像アイコンを提供するクラスを定義しています
画像アイコンは javax.swing.ImageIcon クラスを使います
public class ImageIcon extends Object
	implements Icon, Serializable, Accessible
このクラスは次のようなコンストラクタを公開しています

public ImageIcon()
public ImageIcon(byte[] imageData)
public ImageIcon(byte[] imageData , String description)
public ImageIcon(Image image)
public ImageIcon(Image image , String description)
public ImageIcon(URL location)
public ImageIcon(URL location , String description)
public ImageIcon(String filename)
public ImageIcon(String filename , String description)

沢山ありますが、基本的に画像を生成するための情報を渡すだけです
imageData には AWT の Toolkit でサポートされるイメージ形式によるピクセル配列を
description には、このアイコンの説明用のテキストを指定します

image は、アイコンを示すイメージそのものです
location は、アイコンとなるイメージの位置を表している URL クラスを
filename には、画像ファイルのパスを指定する文字列を指定します

アイコンの説明は ImageIcon.getDescription() で得られます
この説明は、例えば視覚障害を持つ人に、音声で情報を伝えるためなどに使用します
逆に ImageIcon.setDescription() で説明用テキストを設定することも可能です

public String getDescription()
public void setDescription(String description)

getDescription は、このアイコンの説明テキストを取得します
setDescription の description には説明用の文字列を指定します
たとえプログラムが直接これらの情報を利用することがなかったとしても
できる限り、アイコンの詳細情報をテキストで知らせるべきでしょう
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	Icon icon;
	public void init() {
		icon = new ImageIcon("icon.jpg");
	}
	public void paint(Graphics g) {
		icon.paintIcon(this , g , 10 , 10);
	}
}


このプログラムは、アイコン用のイメージファイル "icon.jpg" を読み込み
これをアプレットに paintIcon() メソッドを呼び出して描画させています



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