WisdomSoft - for your serial experiences.

5.8 アイコン

Swing では任意の範囲の描画処理をアイコンとして抽象化できます。通常は画像ファイルをアイコンとして描画する ImageIcon クラスを用い、ラベルやボタンなど UI に組み込みます。

5.8.1 イメージアイコン

ビジネスアプリケーションを筆頭に、近年では多くのソフトウェアのコンポーネントにはアイコンが表示されています。これは、初心者のユーザーでも直観的にアプリケーションの機能を理解、判断できるよう配慮されたものですが、やはり文字だけよりもイメージを使うことで様々な色が使われ、ユーザーインタフェースが華やかになり、高級感を演出できるという効果もあるかもしれません。

AWT にはアイコンという概念は存在せず、アイコンを演出するには独自にコンポーネントを拡張して Image オブジェクトを表示するように仕掛ける以外にありません。しかし、Swing ではアイコンという概念がイメージという概念から切り離されて独立し、多くの Swing コンポーネントがアイコンを表示できるように設計されています。

Swing のアイコンとは javax.swing.Icon インタフェースの実装を指します。全てのアイコンは、この Icon インタフェースとして通信することができるため、独自にプログラマが拡張することも可能です。Icon インタフェースはアイコンのデータを提供するのではなく、アイコンを描画するメソッドを提供します。

表1 Icon インタフェースのメソッド
メソッド 解説
public void paintIcon(Component c, Graphics g, int x, int y) 指定された位置にアイコンを描画する。
public int getIconWidth() アイコンの幅を返す。
public int getIconHeight() アイコンの高さを返す。

表1は Icon インタフェースのメソッドです。このインタフェースはアイコンを描画するメソッドと、アイコンのサイズだけを提供しています。アイコンをどのように描画するかについては実装クラスに委ねられているため、アイコンの実装はイメージ以外の図形や文字列で構成することも可能です。

paintIcon() メソッドに描画先の Component オブジェクトが渡されるのは、アイコンの実装からコンポーネントの背景色や前景色を取得することができるように設計されているためです。

Swing 標準の Icon インタフェースの実装には javax.swing.ImageIcon クラスがあります。このクラスは Image オブジェクトをアイコンとして提供する基本的なアイコンです。 このクラスはコンストラクタで指定したイメージをアイコンとして提供します。

表2 ImageIcon クラスのコンストラクタとメソッド(抜粋)
コンストラクタ 解説
public ImageIcon() 初期化されていないアイコンを生成する。
public ImageIcon(Image image) 指定したイメージでアイコンを生成する。
public ImageIcon(Image image, String description) 指定したイメージと簡易説明文でアイコンを生成する。
public ImageIcon(URL location) 指定した URL のイメージでアイコンを生成する。
public ImageIcon(URL location, String description) 指定した URL のイメージと簡易説明文でアイコンを生成する。
public ImageIcon(String filename) 指定したファイルパスのイメージでアイコンを生成する。
public ImageIcon(String filename, String description) 指定したファイルパスのイメージと簡易説明文でアイコンを生成する。
メソッド
public String getDescription() このアイコンのイメージを説明する文字列を返す。
public void setDescription(String description) このアイコンのイメージを説明する文字列を設定する。null を設定することもできる。
public Image getImage() このアイコンのイメージを返す。
public void setImage(Image image) このアイコンが表示するイメージを設定する。

表2は ImageIcon クラスの主なコンストラクタとメソッドです。ImageIcon クラスは内部にアイコンとして表示するイメージと、そのイメージを説明する文字列を保有します。特別な理由がなければイメージだけでも十分だと思われますが、アイコンの説明を設定しておけば、イメージを認識できない場合の代替処理や、視覚障害者に音声で知らせる場合などに利用することができるでしょう。

コード1
import javax.swing.*;
import java.awt.*;

public class Test extends JComponent {
	public static void main(String args[]) {
		Icon icon = new ImageIcon("icon1.jpg");

		JFrame win = new JFrame();
		win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.getContentPane().add(new Test(icon));
		win.show();
	}

	Icon icon;
	public Test(Icon icon) { this.icon = icon; }
	public void paintComponent(Graphics g) {
		icon.paintIcon(
			this , g ,
			getWidth() / 2 - icon.getIconWidth() / 2 ,
			getHeight() / 2 - icon.getIconHeight() / 2
		);
	}
}
実行結果
コード1 実行結果

コード1は、クラスファイルと同じディレクトリに存在する icon1.jpg ファイルをアイコンとして ImageIcon オブジェクトを生成しています。

Test クラスは Icon オブジェクトをコンストラクタから受け取り、これを paintComoponent() メソッドの実行時にコンポーネントの中央に表示します。最初に生成した ImageIcon オブジェクトを Test() コンストラクタに渡してこのクラスのインスタンスを生成し、このコンポーネントを JFrame ウィンドウに追加しています。プログラムを実行すれば、アイコンがコンポーネントの中央に表示されることを確認することができます。