概要

JMenuItemに設定されたAcceleratorの文字サイズや色を変更します。

サンプルコード

Color color1;
Color color2;
Font font;
List<String> list = Arrays.asList(
    "MenuItem", "CheckBoxMenuItem", "RadioButtonMenuItem");
for (String prefix : list) {
  String key1 = prefix + ".acceleratorForeground";
  String key2 = prefix + ".acceleratorSelectionForeground";
  String key3 = prefix + ".acceleratorFont";
  if (selected) {
    color1 = AFC;
    color2 = Color.WHITE;
    font = UIManager.getFont(key3);
    if (font != null) {
      font = font.deriveFont(10f);
    }
  } else {
    UIDefaults def = UIManager.getLookAndFeelDefaults();
    color1 = def.getColor(key1);
    color2 = def.getColor(key2);
    font = def.getFont(key3);
  }
  UIManager.put(key1, color1);
  UIManager.put(key2, color2);
  UIManager.put(key3, font);
}
SwingUtilities.updateComponentTreeUI(popup);
View in GitHub: Java, Kotlin

解説

  • UIManager.put("MenuItem.acceleratorForeground", color)
    • JMenuItem#setAccelerator(KeyStroke)で設定したacceleratorの文字色を変更
    • MetalLookAndFeelWindowsLookAndFeelなどで有効、NimbusLookAndFeelGTKLookAndFeelなどでは無効
    • JCheckBoxMenuItemJRadioButtonMenuItemには影響しないため、別途CheckBoxMenuItem.acceleratorForegroundなどで設定する必要がある
    • BasicLookAndFeelMenu.acceleratorForegroundMenu.acceleratorSelectionForegroundMenu.acceleratorSelectionFontが設定されているが、JMenuacceleratorを設定しても実行時にjava.lang.Error: setAccelerator() is not defined for JMenu. Use setMnemonic() instead.とエラーになるので無意味
  • UIManager.put("MenuItem.acceleratorSelectionForeground", color)
    • acceleratorの選択文字色を変更
  • UIManager.put("MenuItem.acceleratorSelectionFont", font)
    • acceleratorFontを変更
    • このサンプルではFontサイズをFont#deriveFont(10f)で縮小している

参考リンク

コメント