概要

JColorChooserRGB色選択パネル内に配置された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ではこれらのMnemonicが有効だったようだが、いつから無効になったのかは不明
    • HSV色選択パネルの色相・彩度・値選択用JRadioButtonCMYK色選択パネルのシアン・マゼンタ・黄選択用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" },のような形式でまとめて定義されている

参考リンク

コメント