WisdomSoft - for your serial experiences.

7.2 色選択ダイアログ

色を選択するダイアログを表示します。基本色に加えて RGB 値などの直接入力し、プレビューできる機能がコンポーネントとして備わっています。

7.2.1 カラーチューザ

文書やイメージなど、視覚的な情報を作成、編集するアプリケーションを開発すると、多くの場所でユーザーに視覚的に表示されるオブジェクトの様々なプロパティを選択させる必要があります。テキスト入力や数値入力であれば入力用のコンポーネントを利用することができますが、色をユーザーに選択してもらう方法には工夫が必要です。

熟練ユーザーであれば、色を確実に制御するために数値を使いたがるかもしれません。しかし、初心者ユーザーに 16 進数で色を入力させるのは酷でしょう。アプリケーションは、あらゆるレベルのユーザーを満足させるために、直観的に色を入力できる方法と、数値によってデジタルに色を選択する方法を同時に提供する必要があります。

Swing のコンポーネントを駆使すればこのような条件もさほど難しいものではありませんが、カラーチューザを使えばユーザーに色を選択させるコンポーネントを一度に提供することができます。カラーチューザは javax.swing.JColorChooser クラスで実装されています。

javax.swing.JColorChooser クラス
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JColorChooser
public class JColorChooser extends JComponent implements Accessible

カラーチューザもファイルチューザと同じように JComponent を継承するカラーを選択するためのコンポーネントのセットを提供するコンテナです。カラーチューザを表示すると、色を選択するためのコンポーネントが表示されます。ただし、カラーチューザは決定ボタンなどを保有しないため、ActionListener には対応していません。PropertyChangeListener を用いてプロパティの変更を監視して選択の変更タイミングを知ることができます。

表1 クラスのコンストラクタとメソッド(抜粋)
コンストラクタ 解説
public JColorChooser() 初期色が白のカラーチューザを生成する。
public JColorChooser(Color initialColor) 指定された初期色のカラーチューザ画を生成する。
public JColorChooser(ColorSelectionModel model) 指定された ColorSelectionModel でカラーチューザを生成する。
メソッド
public void setColor(Color color) 現在の色を指定された色に設定する。
public void setColor(int r, int g, int b) 現在の色を指定された RGB 色に設定する。
public void setColor(int c) 現在の色を指定された数値の色に設定する。
public Color getColor() 現在の色値を取得する。
public void setSelectionModel(ColorSelectionModel newModel) 色の選択を扱うデータモデルを返す。
public ColorSelectionModel getSelectionModel() 選択された色を格納するモデルを設定する。
public static Color showDialog(Component component, String title, Color initialColor) throws HeadlessException モーダルダイアログにカラーチューザを表示します。色が選択され、ダイアログが閉じると制御が返る。

カラーチューザの役割は色を選択して Color オブジェクトを返すという単純なものです。コンテナに追加してウィンドウの一部に表示することもできますし、showDialog() メソッドを使ってモーダルダイアログボックスとして表示することも可能です。showDialog() メソッドの仕様はファイルチューザとは異なり、戻り値に選択された色をそのまま返すので注意してください。ユーザーが選択をキャンセルした場合は null が返ります。

通常のカラーチューザは決定ボタンやキャンセルボタンを持ちませんが、

コンストラクタやメソッドから指定する ColorSelectionModel オブジェクトは javax.swing.colorchooser.ColorSelectionModel インタフェースを実装するオブジェクトです。このインタフェースはカラーチューザが選択する色を管理する選択モデルインタフェースですが、Color 型のプロパティとリスナの登録と解除を行うメソッドを宣言しているだけです。

ColorSelectionModel インタフェース setSelectedColor() メソッド
public void setSelectedColor(Color color)
ColorSelectionModel インタフェース getSelectedColor() メソッド
public Color getSelectedColor()
ColorSelectionModel インタフェース addChangeListener() メソッド
public void addChangeListener(ChangeListener listener)
ColorSelectionModel インタフェース removeChangeListener() メソッド
public void removeChangeListener(ChangeListener listener)

setSelectedColor() メソッドgetSElectedColor() メソッドはモデルが選択している色のアクセッサメソッド、addChangeListener() メソッドremoveChangeListener() メソッドには、モデルの値、すなわち選択されている色が変更されたときに呼び出す ChangeListener オブジェクトの追加と解除を行います。

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

public class Test extends JFrame implements ActionListener {
	public static void main(String args[]) {
		JFrame win = new Test();
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.show();
	}

	private JColorChooser colorChooser = new JColorChooser();
	private JButton button = new JButton("カラーチューザを表示する");
	public Test() {
		button.addActionListener(this);

		getContentPane().setLayout(new FlowLayout());
		getContentPane().add(button);
	}

	public void actionPerformed(ActionEvent e) {
		Color color = colorChooser.showDialog(
			this , "色を選択してください" , button.getForeground()
		);

		if (color == null) return;
		button.setForeground(color);
	}
}
実行結果
コード1 実行結果

コード1は、ウィンドウに追加されている「カラーチューザを表示する」ボタンを押すと、カラーチューザが表示されます。カラーチューザのサンプルや HSB、RGB タブの中から自分の好みの方法で色を選択することができます。このプログラムでは、ウィンドウのボタンの前景色を指定した色に変更します。