この記事から得られる知識
JColorChooser
の基本的な使い方(ダイアログ表示)を理解できる。JColorChooser
をコンポーネントとしてウィンドウに直接組み込む方法がわかる。- 色の変更をリアルタイムで検知し、他のコンポーネントに反映させる方法(イベントリスニング)を習得できる。
- カラーチューザーの表示パネル(スウォッチ、RGBなど)を自由にカスタマイズする方法がわかる。
AbstractColorChooserPanel
を継承し、完全に独自のカラー選択パネルを作成する具体的な手順を学べる。
はじめに: javax.swing.JColorChooserとは?
Java Swingは、JavaでデスクトップアプリケーションのGUI(グラフィカルユーザーインターフェース)を開発するための標準的なツールキットの一つです。その豊富なコンポーネント群の中に、今回主役となるjavax.swing.JColorChooser
クラスがあります。
JColorChooser
は、ユーザーが直感的な操作で色を選択できるようにするための、高機能なコンポーネントです。ペイントアプリケーションの描画色選択、テキストエディタの文字色設定、UIテーマのカスタマイズ機能など、アプリケーション内でユーザーに色を選ばせるあらゆる場面で活躍します。
このコンポーネントは、単に色を選択させるだけでなく、複数の選択方式(スウォッチ、HSB、RGBなど)を提供し、プレビュー機能も備わっています。さらに、開発者がこれらの機能をカスタマイズしたり、独自の選択パネルを追加したりすることも可能です。
この記事では、JColorChooser
の最も簡単な使い方から、イベント処理、外観のカスタマイズ、そして独自のカラー選択パネルの実装といった高度なトピックまで、段階的に詳しく解説していきます。
第1章: JColorChooserの基本的な使い方 – ダイアログ表示
JColorChooser
を利用する最も簡単で一般的な方法は、静的メソッドであるshowDialog
を呼び出して、モーダルな色の選択ダイアログを表示することです。 このメソッドは、ユーザーが色を選択して「OK」ボタンを押すか、キャンセルするまでプログラムの実行を一時停止させます。
showDialogメソッド
showDialog
メソッドのシグネチャは以下の通りです。
public static Color showDialog(Component parentComponent, String title, Color initialColor)
引数 | 説明 |
---|---|
parentComponent | ダイアログの親となるコンポーネント。ダイアログはこのコンポーネントの中央に表示されます。通常はアプリケーションのメインフレーム(JFrame )などを指定します。 |
title | ダイアログのタイトルバーに表示される文字列です。 |
initialColor | ダイアログが最初に表示されたときに選択されている初期色です。 |
戻り値は、ユーザーが選択したColor
オブジェクトです。「OK」ボタンが押されると選択された色が返され、「取消」ボタンやウィンドウを閉じるボタンでダイアログが閉じられた場合はnull
が返されます。 これにより、ユーザーが色選択をキャンセルしたかどうかを簡単に判別できます。
サンプルコード
以下は、ボタンをクリックするとカラーチューザーダイアログが表示され、選択した色でフレームの背景色を変更する簡単なサンプルプログラムです。
<?xml version="1.0" encoding="UTF-8"?>
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleColorChooserExample extends JFrame { public SimpleColorChooserExample() { setTitle("JColorChooser 基本的な使い方"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 中央に配置するパネル final JPanel mainPanel = new JPanel(); mainPanel.setBackground(Color.WHITE); // ボタンの作成 JButton chooseColorButton = new JButton("色を選択"); chooseColorButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 現在の背景色を初期色としてダイアログを表示 Color initialColor = mainPanel.getBackground(); Color chosenColor = JColorChooser.showDialog( SimpleColorChooserExample.this, "背景色を選択してください", initialColor); // 色が選択された場合 (nullでない場合) if (chosenColor != null) { mainPanel.setBackground(chosenColor); } } }); // コンポーネントの配置 Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(mainPanel, BorderLayout.CENTER); contentPane.add(chooseColorButton, BorderLayout.SOUTH); } public static void main(String[] args) { // SwingのUIはイベントディスパッチスレッドで作成・更新することが推奨されている SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new SimpleColorChooserExample().setVisible(true); } }); }
}
第2章: コンポーネントとしてのJColorChooser
JColorChooser
はダイアログとしてだけでなく、JPanel
や他のSwingコンポーネントと同様に、コンテナに直接配置することも可能です。 これにより、常に表示されるカラーピッカーをUIに組み込むことができます。
コンポーネントとして利用するには、new JColorChooser()
コンストラクタでインスタンスを生成し、それをJFrame
のコンテンツペインなどに追加します。
色の変更を検知する
コンポーネントとして配置した場合、色の変更をどのように知るかが重要になります。ダイアログと違い、OKボタンで色が返ってくるわけではありません。
ここで登場するのがColorSelectionModel
とChangeListener
です。 JColorChooser
は内部に色の選択状態を管理するColorSelectionModel
を持っています。このモデルに対してChangeListener
を登録することで、色が変更されるたびにイベント通知を受け取ることができます。
サンプルコード
以下のサンプルコードでは、JColorChooser
をウィンドウの中央に配置し、その下部に配置したJLabel
の背景色を、カラーチューザーでの色の変更に追随してリアルタイムに変化させます。
<?xml version="1.0" encoding="UTF-8"?>
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
public class ComponentColorChooserExample extends JFrame { private JColorChooser colorChooser; private JLabel previewLabel; public ComponentColorChooserExample() { setTitle("コンポーネントとしてのJColorChooser"); setSize(600, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // カラーチューザーのインスタンスを作成 colorChooser = new JColorChooser(Color.CYAN); // 色の変更を監視するリスナーを追加 colorChooser.getSelectionModel().addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { // 選択された色を取得 Color newColor = colorChooser.getColor(); // ラベルの背景色を更新 previewLabel.setBackground(newColor); previewLabel.setText("選択中の色: " + colorToHex(newColor)); } }); // プレビュー用のラベル previewLabel = new JLabel("選択中の色: #00FFFF", JLabel.CENTER); previewLabel.setFont(new Font("Monospaced", Font.BOLD, 20)); previewLabel.setOpaque(true); // 背景色を表示するために必要 previewLabel.setBackground(colorChooser.getColor()); // コンポーネントの配置 Container contentPane = getContentPane(); contentPane.add(colorChooser, BorderLayout.CENTER); contentPane.add(previewLabel, BorderLayout.SOUTH); } // Colorオブジェクトを16進数の文字列に変換するヘルパーメソッド private String colorToHex(Color color) { return String.format("#%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue()).toUpperCase(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new ComponentColorChooserExample().setVisible(true); } }); }
}
第3章: JColorChooserの外観カスタマイズ
JColorChooser
は非常に柔軟で、その外観や機能を細かくカスタマイズすることができます。ここでは、代表的なカスタマイズ方法である「プレビューパネルの変更」と「チューザーパネルの選択」について解説します。
プレビューパネルのカスタマイズ
デフォルトでは、ダイアログの下部に選択した色を示すプレビューパネルが表示されます。このプレビューパネルは、setPreviewPanel
メソッドを使って自作のコンポーネントに置き換えることができます。
public void setPreviewPanel(JComponent preview)
引数にnull
を渡せば、プレビューパネルを非表示にすることも可能です。独自のプレビューパネルを作成すれば、例えば選択した色をテキストや図形に適用した結果を、より具体的にユーザーに示すことができます。
以下は、プレビューパネルを非表示にする簡単な例です。
JColorChooser chooser = new JColorChooser();
// プレビューパネルを非表示にする
chooser.setPreviewPanel(new JPanel()); // 空のパネルを設定するか、nullを設定します(一部のL&Fでは空パネルが有効)
チューザーパネルの選択と削除
JColorChooser
はデフォルトで「スウォッチ」「HSB」「RGB」などの複数のタブ(チューザーパネル)を持っています。アプリケーションの要件によっては、特定のパネルだけを表示したい、あるいは不要なパネルを削除したい場合があります。
これらのパネルはAbstractColorChooserPanel
の配列として管理されており、以下のメソッドで操作できます。
getChooserPanels()
: 現在表示されている全てのチューザーパネルをAbstractColorChooserPanel[]
として取得します。removeChooserPanel(AbstractColorChooserPanel panel)
: 指定したパネルをチューザーから削除します。setChooserPanels(AbstractColorChooserPanel[] panels)
: 表示するパネルを、指定した配列で完全に置き換えます。表示順の変更も可能です。
サンプルコード: RGBパネルのみを表示する
ここでは、デフォルトのパネルから「RGB」パネルだけを残し、他をすべて削除する例を示します。
<?xml version="1.0" encoding="UTF-8"?>
import javax.swing.*;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import java.awt.*;
public class CustomizeChooserPanelExample { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JColorChooser chooser = new JColorChooser(); // 現在のパネルを取得 AbstractColorChooserPanel[] oldPanels = chooser.getChooserPanels(); // RGBパネルだけを保持する AbstractColorChooserPanel rgbPanel = null; for (AbstractColorChooserPanel panel : oldPanels) { if (panel.getDisplayName().equals("RGB")) { rgbPanel = panel; break; } } // RGBパネルが見つかった場合、それだけをセットする if (rgbPanel != null) { chooser.setChooserPanels(new AbstractColorChooserPanel[]{rgbPanel}); } // ダイアログを表示して確認 JColorChooser.showDialog(null, "RGBパネルのみのカラーチューザー", chooser.getColor()); } }); }
}
第4章: 高度なカスタマイズ – 独自のカラーパネル作成
JColorChooser
の最も強力な機能の一つが、javax.swing.colorchooser.AbstractColorChooserPanel
クラスを継承して、完全に独自のカラー選択パネルを作成できることです。 これにより、アプリケーション特有のカラーピッカー(例えば、特定の色調のパレット、グレースケール専用スライダーなど)を実装できます。
独自のパネルを作成するには、AbstractColorChooserPanel
を継承し、いくつかの抽象メソッドをオーバーライドする必要があります。
実装が必要な主要メソッド
メソッド | 説明 |
---|---|
void buildChooser() | パネルのUIコンポーネント(スライダー、ボタン、テキストフィールドなど)を構築し、配置する処理を記述します。このメソッドはパネルがインスタンス化される際に一度だけ呼ばれます。 |
void updateChooser() | JColorChooser のColorSelectionModel が変更されたときに呼び出されます。モデルから現在の色を取得し、buildChooser で作成したUIコンポーネントにその色を反映させる処理を記述します。 |
String getDisplayName() | チューザーのタブに表示されるパネルの名前を返します。 |
Icon getSmallDisplayIcon() | タブに表示される小さいアイコンを返します。不要な場合はnull を返します。 |
Icon getLargeDisplayIcon() | (L&Fによっては)使われる大きいアイコンを返します。不要な場合はnull を返します。 |
パネル内のUIコンポーネントがユーザーによって操作され、色が変更された際には、getColorSelectionModel().setSelectedColor(newColor)
を呼び出して、変更をJColorChooser
全体に通知することが重要です。
サンプルコード: グレースケール選択パネルの実装
0から255までのグレースケールを一つのスライダーで選択できる、シンプルなカスタムパネルを作成してみましょう。
<?xml version="1.0" encoding="UTF-8"?>
import javax.swing.*;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
// 1. AbstractColorChooserPanelを継承したクラスを作成
class GrayscaleColorChooserPanel extends AbstractColorChooserPanel { private JSlider grayscaleSlider; private JLabel valueLabel; @Override public void updateChooser() { // モデルから色を取得し、スライダーに反映する Color color = getColorFromModel(); if (color != null) { // 色の明るさ(この場合はR,G,Bの平均に近い値)をスライダーの値とする int grayValue = (color.getRed() + color.getGreen() + color.getBlue()) / 3; grayscaleSlider.setValue(grayValue); } } @Override protected void buildChooser() { // パネルのレイアウトを設定 setLayout(new BorderLayout(10, 10)); // UIコンポーネントの構築 grayscaleSlider = new JSlider(JSlider.VERTICAL, 0, 255, 128); grayscaleSlider.setMajorTickSpacing(64); grayscaleSlider.setMinorTickSpacing(16); grayscaleSlider.setPaintTicks(true); grayscaleSlider.setPaintLabels(true); grayscaleSlider.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); valueLabel = new JLabel("128", JLabel.CENTER); // スライダーの変更を監視するリスナー grayscaleSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { int value = grayscaleSlider.getValue(); valueLabel.setText(String.valueOf(value)); // 新しいグレースケール色を作成 Color newGrayColor = new Color(value, value, value); // ColorSelectionModelに色の変更を通知 getColorSelectionModel().setSelectedColor(newGrayColor); } }); // コンポーネントをパネルに追加 add(grayscaleSlider, BorderLayout.CENTER); add(valueLabel, BorderLayout.SOUTH); } @Override public String getDisplayName() { return "グレースケール"; } @Override public Icon getSmallDisplayIcon() { return null; } @Override public Icon getLargeDisplayIcon() { return null; }
}
// カスタムパネルをテストするためのメインクラス
public class CustomChooserPanelTest { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JColorChooser chooser = new JColorChooser(); // 作成したカスタムパネルをインスタンス化 GrayscaleColorChooserPanel grayscalePanel = new GrayscaleColorChooserPanel(); // JColorChooserにカスタムパネルを追加 chooser.addChooserPanel(grayscalePanel); // RGBパネルを削除して、よりシンプルに AbstractColorChooserPanel[] panels = chooser.getChooserPanels(); for (AbstractColorChooserPanel panel : panels) { if (panel.getDisplayName().equals("RGB")) { chooser.removeChooserPanel(panel); } } // ダイアログを表示 JDialog dialog = JColorChooser.createDialog(null, "カスタムパネルテスト", true, chooser, null, null); dialog.setVisible(true); }); }
}
まとめ
本記事では、Java SwingのJColorChooser
について、基本的なダイアログとしての使い方から、コンポーネントとしての配置、イベント処理、そして外観のカスタマイズ、さらには独自のカラー選択パネルを作成する高度なテクニックまで、幅広く掘り下げてきました。
JColorChooser
は、一見すると単純な色の選択ダイアログですが、その裏側にはSwingコンポーネントの柔軟性と拡張性の高さを示す、多くの強力な機能が備わっています。
- 手軽さ:
showDialog
メソッド一行で、高機能な色選択ダイアログを瞬時に利用できます。 - 統合性: コンポーネントとしてUIに直接組み込み、
ChangeListener
を使えばリアルタイムな色の反映が可能です。 - 柔軟性: プレビューパネルやチューザーパネルを自由にカスタマイズし、アプリケーションに最適な形に調整できます。
- 拡張性:
AbstractColorChooserPanel
を継承することで、可能性は無限に広がり、完全にオリジナルの色選択体験をユーザーに提供できます。
Java Swingはレガシーな技術と見なされることもありますが、JColorChooser
のような洗練されたコンポーネントは、今なお多くの既存アプリケーションで稼働しており、その設計思想は現代のUIツールキットを学ぶ上でも非常に参考になります。この記事が、皆さんのJavaデスクトップアプリケーション開発の一助となれば幸いです。