JColorChooserのRGB色選択パネルでアルファ設定用のJSliderとJSpinnerを無効化する
Total: 725
, Today: 1
, Yesterday: 8
Posted by aterai at
Last-modified:
概要
JColorChooser
のRGB
色選択パネルでアルファ設定用のJSlider
とJSpinner
を無効化、または非表示に変更します。
Screenshot
Advertisement
サンプルコード
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
番目に出現する
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)
で非表示化- [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);
});
参考リンク
- [JDK-8051548] JColorChooser should have a way to disable transparency controls - Java Bug System
- JColorChooser#showDialog(...) (Java SE 9 & JDK 9)
- なぜか
@since 9
が付いていない? - [JDK-8343037] Missing @since tag on JColorChooser.showDialog overload - Java Bug Systemで修正される模様
- なぜか
- swing - Java 7 JColorChooser: Disable Transparency Slider - Stack Overflow
- リフレクションを使用してアルファ用コンポーネントを取得し無効化、非表示化を行っている
- JFileChooserがディレクトリ選択モードの場合ファイルフィルタ用のJComboBoxを無効化する