前回の続きです。
前の記事のコードでは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;
}
}