Swing/RgbRadioButtonMnemonic の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/RgbRadioButtonMnemonic へ行く。
- Swing/RgbRadioButtonMnemonic の差分を削除
--- category: swing folder: RgbRadioButtonMnemonic title: JColorChooserのRGB色選択JRadioButtonにMnemonicを設定する tags: [JColorChooser, JRadioButton, UIManager] author: aterai pubdate: 2023-11-27T03:52:23+09:00 description: JColorChooserのRGB色選択パネル内に配置されたRGB選択用JRadioButtonのテキストに表示されたMnemonicを有効化します。 image: https://drive.google.com/uc?id=1PCMoVMxkXTzrdR85EBmOo36H_oe08ryp --- * 概要 [#summary] `JColorChooser`の`RGB`色選択パネル内に配置された`RGB`選択用`JRadioButton`のテキストに表示された`Mnemonic`を有効化します。 #download(https://drive.google.com/uc?id=1PCMoVMxkXTzrdR85EBmOo36H_oe08ryp) * サンプルコード [#sourcecode] #code(link){{ JColorChooser cc = new JColorChooser(); cc.setColor(label.getBackground()); AbstractColorChooserPanel rgbChooser = getRgbChooser(cc); if (rgbChooser != null) { AbstractColorChooserPanel[] panels = cc.getChooserPanels(); List<AbstractColorChooserPanel> choosers = new ArrayList<>(Arrays.asList(panels)); List<String> rgbKey = Arrays.asList("rgbRed", "rgbGreen", "rgbBlue"); String fmt = "ColorChooser.%sText"; List<String> rgbList = Arrays.asList( UIManager.getString(String.format(fmt, rgbKey.get(0)), rgbChooser.getLocale()), UIManager.getString(String.format(fmt, rgbKey.get(1)), rgbChooser.getLocale()), UIManager.getString(String.format(fmt, rgbKey.get(2)), rgbChooser.getLocale())); SwingUtils.descendants(rgbChooser) .filter(JRadioButton.class::isInstance) .map(JRadioButton.class::cast) .forEach(r -> { String txt = r.getText(); int idx = rgbList.indexOf(txt); if (idx >= 0) { String key = String.format("ColorChooser.%sMnemonic", rgbKey.get(idx)); int mnemonic = getInteger(rgbChooser, key); if (mnemonic > 0) { r.setMnemonic(Character.toChars(mnemonic)[0]); mnemonic = getInteger(this, key + "Index"); if (mnemonic >= 0) { r.setDisplayedMnemonicIndex(mnemonic); } } } }); cc.setChooserPanels(choosers.toArray(new AbstractColorChooserPanel[0])); } }} * 解説 [#explanation] - `Default` -- `MetalLookAndFeel`などで使用可能な`RGB`色選択パネルの`RGB`選択用`JRadioButton`にはそれぞれ`赤(D)`、`緑(N)`、`青(B)`と`Mnemonic`が設定されているがKBD{Alt+B}などをキー入力しても効果がない -- [https://bugs.openjdk.org/browse/JDK-4917411 [JDK-4917411] RGB dialog of JColorChooser missing mnemonics for Red and Blue colors in French - Java Bug System]のようなバグレポートが存在するので少なくとも`Java 1.4`では有効だったようだが、いつから無効になったのかは不明 -- `HSV`色選択パネルの色相・彩度・値選択用`JRadioButton`や、`CMYK`色選択パネルのシアン・マゼンタ・黄選択用`JRadioButton`のように`Mnemonic`なしに揃える場合は以下のように赤・緑・青選択用`JRadioButton`のテキストを変更する必要がある -- `MetalLookAndFeel`などで使用可能な`RGB`色選択パネルの`RGB`選択用`JRadioButton`テキストにはそれぞれ`赤(D)`、`緑(N)`、`青(B)`と`Mnemonic`が表示されているが、KBD{Alt+B}などをキー入力しても効果がない -- [https://bugs.openjdk.org/browse/JDK-4917411 [JDK-4917411] RGB dialog of JColorChooser missing mnemonics for Red and Blue colors in French - Java Bug System]のようなバグレポートが存在するので少なくとも`Java 1.4`ではこれらの`Mnemonic`が有効だったようだが、いつから無効になったのかは不明 -- `HSV`色選択パネルの色相・彩度・値選択用`JRadioButton`や`CMYK`色選択パネルのシアン・マゼンタ・黄選択用`JRadioButton`のように`Mnemonic`なしに揃える場合は、以下のように赤・緑・青選択用`JRadioButton`のテキストを変更する必要がある #code{{ UIManager.put("ColorChooser.rgbRedText", "Red"); UIManager.put("ColorChooser.rgbGreenText", "Green"); UIManager.put("ColorChooser.rgbBlueText", "Blue"); }} - `Mnemonic` -- `RGB`色選択パネルの子孫コンポーネントを検索して`JRadioButton`を取得 -- 取得した`JRadioButton`のタイトルが、たとえば`UIManager.get("ColorChooser.rgbRedText")`と一致する場合は`UIManager.get("ColorChooser.rgbRedMnemonic")`で`Mnemonic`を取得して設定 --- 赤選択用`JRadioButton`のテキストと`Mnemonic`は`java.desktop/com/sun/swing/internal/plaf/basic/resources/basic.java`で`{ "ColorChooser.rgbRed.textAndMnemonic", "Re&d" },`のような形式でまとめて定義されている * 参考リンク [#reference] - [[JColorChooserのRGB色選択パネル内に表示される16進数カラーコードにAlpha値を追加する>Swing/ColorChooserRgbaHexCode]] -- `RGB`色選択パネルの取得方法は上記と同様 - [https://bugs.openjdk.org/browse/JDK-4917411 [JDK-4917411] RGB dialog of JColorChooser missing mnemonics for Red and Blue colors in French - Java Bug System] * コメント [#comment] #comment #comment