• category: swing folder: ColorTransparencySelectionEnabled title: JColorChooserのRGB色選択パネルでアルファ設定用のJSliderとJSpinnerを無効化する tags: [JColorChooser] author: aterai pubdate: 2022-11-14T00:20:01+09:00 description: JColorChooserのRGB色選択パネルでアルファ設定用のJSliderとJSpinnerを無効化、または非表示に変更します。 image: https://drive.google.com/uc?id=1nww921FRgkdq2p5cjnEw1g7CBSXvt54I

概要

JColorChooserRGB色選択パネルでアルファ設定用のJSliderJSpinnerを無効化、または非表示に変更します。

サンプルコード

private void setTransparencySelectionEnabled(AbstractColorChooserPanel p) {
  String alphaName = UIManager.getString("ColorChooser.rgbAlphaText", p.getLocale());
  List<Component> list = SwingUtils.descendants(p).collect(Collectors.toList());
  int idx0 = 0;
  int idx1 = 0;
  int tgtIndex = 3; // rgbAlpha in RGB ColorChooserPanel
  // int tgtIndex = 4; // cmykAlpha in CMYK ColorChooserPanel
  for (Component c : list) {
    if (c instanceof JLabel && alphaName.equals(((JLabel) c).getText())) {
      setEnabledOrVisible(c);
    } else if (c instanceof JSlider) {
      if (idx0 == tgtIndex) {
        setEnabledOrVisible(c);
      }
      idx0 += 1;
    } else if (c instanceof JSpinner) {
      if (idx1 == tgtIndex) {
        setEnabledOrVisible(c);
      }
      idx1 += 1;
    }
  }
}

private void setEnabledOrVisible(Component c) {
  if (enabledRadio.isSelected()) {
    c.setEnabled(false);
  } else {
    c.setVisible(false);
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、RGB色選択パネルの子コンポーネントをすべて取得し、0番目に赤、1番目に緑、2番目に青、3番目にアルファ用のコンポーネントが出現すると想定してそれぞれ3番目に出現する JSliderJSpinnerを無効化、または非表示化しています。

  • Default
    • デフォルトのJColorChooserRGB色選択パネルのアルファやHSV色選択パネルで透明度が変更可能
    • GTKLookAndFeelのデフォルトJColorChooserにはRGB色選択パネルが存在せず、またアルファや透明度を設定不可?なのでJColorChooser#setUI(new BasicColorChooserUI())などを設定してエラーを回避する必要がある
  • setEnabled(false)
    • 名前がUIManager.getString("ColorChooser.rgbAlphaText", getLocale())と一致するJLabelsetEnabled(false)で無効化
    • 3番目のアルファ用JSlidersetEnabled(false)で無効化
    • 3番目のアルファ用JSpinnersetEnabled(false)で無効化
  • setVisible(false)
    • 名前がUIManager.getString("ColorChooser.rgbAlphaText", getLocale())と一致するJLabelc.setVisible(false)で非表示化
    • 3番目のアルファ用JSlidersetVisible(false)で非表示化
    • 3番目のアルファ用JSpinnersetVisible(false)で非表示化
    • [JDK-8051548] JColorChooser should have a way to disable transparency controls - Java Bug System
      • Java 9からJColorChooser.showDialog(...)の引数が追加されて、RGB色選択パネルのアルファやHSV色選択パネルで透明度を非表示にしてJColorChooserを開くことが可能になった
JButton button2 = new JButton("JColorChooser");
button2.addActionListener(e -> {
  Component rp = getRootPane();
  // JColorChooser should have a way to disable transparency controls - Java Bug System
  // https://bugs.openjdk.org/browse/JDK-8051548
  // Java 9:
  Color c = JColorChooser.showDialog(rp, "", label.getBackground(), check.isSelected());
  label.setBackground(c);
});

参考リンク

コメント