diff --git a/CHANGELOG.md b/CHANGELOG.md
index 735724d9..a04ca994 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ FlatLaf Change Log
- Menus: On Windows, pressing F10 now activates the menu bar without
showing a menu popup (as usual on Windows platform). On other platforms the
first menu popup is shown.
+- Show mnemonics always when a menu bar is active or a popup menu is visible.
- Hide mnemonics if window is deactivated (e.g. Alt+Tab to another
window). (issue #43)
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/MnemonicHandler.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/MnemonicHandler.java
index 7b2b220f..8540973c 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/MnemonicHandler.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/MnemonicHandler.java
@@ -31,8 +31,12 @@ import javax.swing.AbstractButton;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JTabbedPane;
+import javax.swing.MenuElement;
+import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import com.formdev.flatlaf.util.SystemInfo;
/**
@@ -41,7 +45,7 @@ import com.formdev.flatlaf.util.SystemInfo;
* @author Karl Tauber
*/
class MnemonicHandler
- implements KeyEventPostProcessor
+ implements KeyEventPostProcessor, ChangeListener
{
private static boolean showMnemonics;
private static WeakReference lastShowMnemonicWindow;
@@ -53,10 +57,12 @@ class MnemonicHandler
void install() {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor( this );
+ MenuSelectionManager.defaultManager().addChangeListener( this );
}
void uninstall() {
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventPostProcessor( this );
+ MenuSelectionManager.defaultManager().removeChangeListener( this );
}
@Override
@@ -65,16 +71,33 @@ class MnemonicHandler
if( SystemInfo.IS_MAC ) {
// Ctrl+Alt keys must be pressed on Mac
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_ALT )
- showMnemonics( e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown() && e.isAltDown(), e.getComponent() );
+ showMnemonics( shouldShowMnemonics( e ) && e.isControlDown() && e.isAltDown(), e.getComponent() );
} else {
// Alt key must be pressed on Windows and Linux
if( keyCode == KeyEvent.VK_ALT )
- showMnemonics( e.getID() == KeyEvent.KEY_PRESSED, e.getComponent() );
+ showMnemonics( shouldShowMnemonics( e ), e.getComponent() );
}
return false;
}
+ private boolean shouldShowMnemonics( KeyEvent e ) {
+ return e.getID() == KeyEvent.KEY_PRESSED ||
+ MenuSelectionManager.defaultManager().getSelectedPath().length > 0;
+ }
+
+ @Override
+ public void stateChanged( ChangeEvent e ) {
+ MenuElement[] selectedPath = MenuSelectionManager.defaultManager().getSelectedPath();
+ if( selectedPath.length > 0 ) {
+ // show mnemonics when a menu item is selected
+ showMnemonics( true, (Component) selectedPath[0] );
+ } else {
+ // hide mnemonics when menu selection was canceled
+ showMnemonics( false, null );
+ }
+ }
+
private void showMnemonics( boolean show, Component c ) {
if( show == showMnemonics )
return;
diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java
index 5fea98b5..f57becb2 100644
--- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java
+++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java
@@ -602,14 +602,17 @@ class BasicComponentsPanel
//---- cutMenuItem ----
cutMenuItem.setText("Cut");
+ cutMenuItem.setMnemonic('C');
popupMenu1.add(cutMenuItem);
//---- copyMenuItem ----
copyMenuItem.setText("Copy");
+ copyMenuItem.setMnemonic('O');
popupMenu1.add(copyMenuItem);
//---- pasteMenuItem ----
pasteMenuItem.setText("Paste");
+ pasteMenuItem.setMnemonic('P');
popupMenu1.add(pasteMenuItem);
}
// JFormDesigner - End of component initialization //GEN-END:initComponents
diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd
index cf19d4ca..c4ddcfe8 100644
--- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd
+++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd
@@ -601,14 +601,17 @@ new FormModel {
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "cutMenuItem"
"text": "Cut"
+ "mnemonic": 67
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyMenuItem"
"text": "Copy"
+ "mnemonic": 79
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "pasteMenuItem"
"text": "Paste"
+ "mnemonic": 80
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 500 )