• 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

概要

JColorChooserのRGB色選択パネル内に配置されたRGB選択用JRadioButtonのテキストに表示されたMnemonicを有効化します。

サンプルコード

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]));
}
View in GitHub: Java, Kotlin

解説

  • Default
    • MetalLookAndFeelなどで使用可能なRGB色選択パネルのRGB選択用JRadioButtonにはそれぞれ赤(D)緑(N)青(B)Mnemonicが設定されているがAlt+Bなどを入力しても効果がない
    • [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のテキストを変更する
      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のテキストとMnemonicjava.desktop/com/sun/swing/internal/plaf/basic/resources/basic.java{ "ColorChooser.rgbRed.textAndMnemonic", "Re&d" },のような形式でまとめて定義されている

参考リンク

コメント