[Java] 98 JColorChooserのshowDialogメソッドを自製

前回の続きです。

前の記事のコードではJcolorChooserダイアログの取消ボタンが効かず、変更した色のRGB値が返されてしまいます。そこでActionListenerとしてokListenerとcancelListenerを追加しました。

それぞれのアクションとして戻り値のRGBA値を作成しますが、public修飾子が使えずこれらをActionListenerの外に渡す方法が分からなくて少々苦労しました。

結局、初期設定で作成しておいたint配列color_caseに移し替えるという何とも泥臭い方法で取り出しました。Javaの仕様ではこうするしかないようです。

okListenerとcancelListenerを今回のように使っているコード例はGoogle検索上位では見あたらなかったのでアップしておきます。

<メソッドのみ>

static int[] showDialog(Component component, String title, Color initialColor) throws HeadlessException{
		int[] color_case = new int[4];
		JColorChooser chooser = new JColorChooser(initialColor != null ? initialColor : Color.white);

		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");

		List<String> list = Arrays.asList(hsv,hsl,rgb);

		for (AbstractColorChooserPanel p : chooser.getChooserPanels()) {
			if (!list.contains(p.getDisplayName())) {
				chooser.removeChooserPanel(p);
			}
		}
		
		ColorTracker tracker = new ColorTracker(chooser,initialColor);

		ActionListener okListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int[] colors = tracker.getColor();
				color_case[0] = colors[0];
				color_case[1] = colors[1];
				color_case[2] = colors[2];
				color_case[3] = colors[3];
			}
		};

		ActionListener cancelListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int[] colors = tracker.getInitial();
				color_case[0] = colors[0];
				color_case[1] = colors[1];
				color_case[2] = colors[2];
				color_case[3] = colors[3];
			}
		};

		// ダイアログを作成
		JDialog dialog = JColorChooser.createDialog(component, title, true, chooser, okListener, cancelListener);
		dialog.setVisible(true);

		return color_case;
	}

	static class ColorTracker implements Serializable{
		JColorChooser chooser;
		Color color;
		int red;
		int green;
		int blue;
		int alpha;
		int[] colors;
	  
		ColorTracker(JColorChooser Chooser,Color initialColor){
			this.chooser = Chooser;
			this.color = initialColor;
			
		}
	  
		int[] getColor(){
			this.color = this.chooser.getColor();

			colors = new int[4];
			colors[0] = this.color.getRed();
			colors[1] = this.color.getGreen();
			colors[2] = this.color.getBlue();
			colors[3] = this.color.getAlpha();

			return colors;
		}
		int[] getInitial(){
			colors = new int[4];
			colors[0] = this.color.getRed();
			colors[1] = this.color.getGreen();
			colors[2] = this.color.getBlue();
			colors[3] = this.color.getAlpha();

			return colors;
		}
	}