• category: swing folder: CrossMenuMnemonic title: JMenuの表示中に別JMenu表示のMnemonicキーが入力された場合の動作を設定する tags: [JMenu, Mnemonic, UIManager, LookAndFeel] author: aterai pubdate: 2019-10-07T15:56:56+09:00 description: トップレベルのJMenuの表示中に別のトップレベルJMenuを開くMnemonicキーが入力された場合、それらのポップアップ表示を切り替えるかどうかを設定します。 image: https://drive.google.com/uc?id=1dyq9CF4OHfr0yYxPQYInJOIbHQMEYtuJ

概要

トップレベルのJMenuの表示中に別のトップレベルJMenuを開くMnemonicキーが入力された場合、それらのポップアップ表示を切り替えるかどうかを設定します。

サンプルコード

String key = "Menu.crossMenuMnemonic";

boolean b = UIManager.getBoolean(key);
System.out.println(key + ": " + b);
JCheckBox check = new JCheckBox(key, b) {
  @Override public void updateUI() {
    super.updateUI();
    setSelected(UIManager.getLookAndFeelDefaults().getBoolean(key));
    UIManager.put(key, isSelected());
  }
};
check.addActionListener(e -> {
  UIManager.put(key, ((JCheckBox) e.getSource()).isSelected());
  SwingUtilities.updateComponentTreeUI(getRootPane().getJMenuBar());
});
View in GitHub: Java, Kotlin

解説

  • Menu.crossMenuMnemonic: true
    • MetalLookAndFeelMotifLookAndFeelのデフォルト
    • トップレベルのJMenuの表示中に別のトップレベルJMenuを開くMnemonicキーが入力された場合、別のトップレベルJMenuのポップアップに切り替わる
    • たとえばこのサンプルでAlt+FAlt+Eを入力するとEditメニューがポップアップ表示状態になる
  • Menu.crossMenuMnemonic: false
    • WindowsLookAndFeelNimbusLookAndFeelのデフォルト
    • トップレベルのJMenuの表示中に別のトップレベルJMenuを開くMnemonicキーが入力されても無視される(元のトップレベルJMenuのポップアップ表示が継続する)
    • たとえばこのサンプルでAlt+FAlt+Eを入力するとFileメニューがポップアップ表示状態になる

  • トップレベルではないJMenu(JToolBar直下ではなく、JPopupMenu以下に追加されているJMenu)にはこの設定は無関係
  • UIManager.put("Menu.crossMenuMnemonic", ...);で設定を切り替えた場合、SwingUtilities.updateComponentTreeUI(...)などでLoolAndFeelUIプロパティを更新する必要がある

参考リンク

コメント