[Java] 97 JColorChooserクラス

自製アプリに色調整の機能を追加するためダイアログを作成しようとしましたが、取り掛かる前にJColorChooserという便利なクラスを見つけました。機能的にはこれで十分です。

下記コードは色調整ダイアログを表示するボタンのアクションです。listを書き換えると表示タブを変更・並べ替えできます。今回は”swatches”以外の4つのタブを選択しています。またデフォルトにある下段のプレビュー部を消してみました。

デフォルトの5つのタブから取捨選択したChooserはcreateDialogでダイアログを作成する際に引数として使用します。

自製showDialogメソッドはJColorChooser.showDialogメソッドとは異なりOKボタンを押した時のRGB値を返してくれないので、これを追跡して返すColorTrackerクラスを用意しました。GitHubにあったコードに手を入れて作成しました。

思いのほか手間が掛かり半日を要しましたが、C/C++で書く苦労を考えれば大分マシでしょう。

<ライブラリは省略>

public class AdjustButtonAction{
    public static void main(){
      adj_btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				if(e.getSource() == adj_btn){
					Color defaultColor = new Color(65,105,225);
					Color color = showDialog(parent, "色の調整", defaultColor);

					if(color == null) {
						System.out.println("選択されず");
					}else {
						System.out.println("R " + color.getRed());
						System.out.println("G " + color.getGreen());
						System.out.println("B " + color.getBlue());
        			}
				}
			}
		});
    }
	
	static Color showDialog(Component component, String title, Color initialColor) throws HeadlessException{
		JColorChooser chooser = new JColorChooser(initialColor != null ? initialColor : Color.white);
		
		// デフォルトの下段にあるプレビューを非表示にする
		chooser.setPreviewPanel(new JPanel());

		String swatches = UIManager.getString("ColorChooser.swatchesNameText");
		String hsv = UIManager.getString("ColorChooser.hsvNameText");
		String hsl = UIManager.getString("ColorChooser.hslNameText");
		String rgb = UIManager.getString("ColorChooser.rgbNameText");
		String cmyk = UIManager.getString("ColorChooser.cmykNameText");
		System.out.println("swatches " + swatches);
		System.out.println("hsv " + hsv);
		System.out.println("hsl " + hsl);
		System.out.println("rgb " + rgb);
		System.out.println("cmyk " + cmyk);

		// 色フォーマットのタブを選択
		List<String> list = Arrays.asList(hsv,hsl,rgb,cmyk);

		for (AbstractColorChooserPanel p : chooser.getChooserPanels()) {
			if (!list.contains(p.getDisplayName())) {
				chooser.removeChooserPanel(p);
			}
		}
	
		// ダイアログ作成
		ColorTracker ok = new ColorTracker(chooser);
		JDialog dialog = JColorChooser.createDialog(component, title, true, chooser, null, null);

		dialog.setVisible(true); 

		return ok.getColor();

	}
	static class ColorTracker implements ActionListener, Serializable{
		JColorChooser chooser;
		Color color;
	  
		ColorTracker(JColorChooser Chooser){
			this.chooser = Chooser;
		}
	  
		public void actionPerformed(ActionEvent e){
		}
	  
		Color getColor(){
			this.color = this.chooser.getColor();
			System.out.println("this.color " + this.color);
		return this.color;
		}
	}
}
--------------------------------------------------
出力
--------------------------------------------------
swatches サンプル(S)
hsv HSV(H)
hsl HSL(L)
rgb RGB(G)
cmyk CMYK
this.color java.awt.Color[r=65,g=105,b=225]
R 65
G 105
B 225