Swing/ColorTransparencySelectionEnabled の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ColorTransparencySelectionEnabled へ行く。
- Swing/ColorTransparencySelectionEnabled の差分を削除
--- 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 --- * 概要 [#summary] `JColorChooser`の`RGB`色選択パネルでアルファ設定用の`JSlider`と`JSpinner`を無効化、または非表示に変更します。 #download(https://drive.google.com/uc?id=1nww921FRgkdq2p5cjnEw1g7CBSXvt54I) * サンプルコード [#sourcecode] #code(link){{ 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); } } }} * 解説 [#explanation] 上記のサンプルでは、`RGB`色選択パネルの子コンポーネントをすべて取得し、`0`番目に赤、`1`番目に緑、`2`番目に青、`3`番目にアルファ用のコンポーネントが出現すると想定してそれぞれ`3`番目に出現する `JSlider`と`JSpinner`を無効化、または非表示化しています。 - `Default` -- デフォルトの`JColorChooser`は`RGB`色選択パネルのアルファや`HSV`色選択パネルで透明度が変更可能 -- `GTKLookAndFeel`のデフォルト`JColorChooser`には`RGB`色選択パネルが存在せず、またアルファや透明度を設定不可?なので`JColorChooser#setUI(new BasicColorChooserUI())`などを設定してエラーを回避する必要がある - `setEnabled(false)` -- 名前が`UIManager.getString("ColorChooser.rgbAlphaText", getLocale())`と一致する`JLabel`を`setEnabled(false)`で無効化 -- `3`番目のアルファ用`JSlider`を`setEnabled(false)`で無効化 -- `3`番目のアルファ用`JSpinner`を`setEnabled(false)`で無効化 - `setVisible(false)` -- 名前が`UIManager.getString("ColorChooser.rgbAlphaText", getLocale())`と一致する`JLabel`を`c.setVisible(false)`で非表示化 -- `3`番目のアルファ用`JSlider`を`setVisible(false)`で非表示化 -- `3`番目のアルファ用`JSpinner`を`setVisible(false)`で非表示化 ---- - `Java 9`から`JColorChooser.showDialog(...)`の引数が追加されて、`RGB`色選択パネルのアルファや`HSV`色選択パネルで透明度を非表示にして`JColorChooser`を開くことが可能になった -- [[[JDK-8051548] JColorChooser should have a way to disable transparency controls - Java Bug System>https://bugs.openjdk.org/browse/JDK-8051548]] --- `Java 9`から`JColorChooser.showDialog(...)`の引数が追加されて、`RGB`色選択パネルのアルファや`HSV`色選択パネルで透明度を非表示にして`JColorChooser`を開くことが可能になった #code{{ JButton button2 = new JButton("JColorChooser"); button2.addActionListener(e -> { Component rp = getRootPane(); // JColorChooser should have a way to disable transparency controls - Java Bug System // JColorChooser should have a way to disable transparency controls // https://bugs.openjdk.org/browse/JDK-8051548 // Java 9: Color c = JColorChooser.showDialog(rp, "", label.getBackground(), check.isSelected()); Color c = JColorChooser.showDialog( rp, "", label.getBackground(), check.isSelected()); label.setBackground(c); }); }} * 参考リンク [#reference] - [[[JDK-8051548] JColorChooser should have a way to disable transparency controls - Java Bug System>https://bugs.openjdk.org/browse/JDK-8051548]] - [https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JColorChooser.html#showDialog-java.awt.Component-java.lang.String-java.awt.Color-boolean- JColorChooser#showDialog(...) (Java SE 9 & JDK 9)] -- なぜか`@since 9`が付いていない? -- [https://bugs.openjdk.org/browse/JDK-8343037 [JDK-8343037] Missing @since tag on JColorChooser.showDialog overload - Java Bug System]で修正される模様 - [https://stackoverflow.com/questions/12026767/java-7-jcolorchooser-disable-transparency-slider swing - Java 7 JColorChooser: Disable Transparency Slider - Stack Overflow] -- リフレクションを使用してアルファ用コンポーネントを取得し無効化、非表示化を行っている - [[JFileChooserがディレクトリ選択モードの場合ファイルフィルタ用のJComboBoxを無効化する>Swing/DisableFilterComboBox]] * コメント [#comment] #comment #comment