From 870d039541dcb7fb2df6959bcedfba3b0ae956ae Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 29 Apr 2020 12:06:00 +0200 Subject: [PATCH] hide mnemonics if window is deactivated (e.g. Alt+Tab to another window) (issue #43) --- CHANGELOG.md | 6 +++++ .../com/formdev/flatlaf/MnemonicHandler.java | 26 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcd6adda..ab2fa1ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ FlatLaf Change Log ================== +## Unreleased + +- Hide mnemonics if window is deactivated (e.g. Alt+Tab to another + window). (issue #43) + + ## 0.33 - Improved creation of disabled grayscale icons used in disabled buttons, labels 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 079e1421..7b2b220f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/MnemonicHandler.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/MnemonicHandler.java @@ -18,10 +18,14 @@ package com.formdev.flatlaf; import java.awt.Component; import java.awt.Container; +import java.awt.EventQueue; import java.awt.KeyEventPostProcessor; import java.awt.KeyboardFocusManager; import java.awt.Window; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; import java.lang.ref.WeakReference; import javax.swing.AbstractButton; import javax.swing.JLabel; @@ -41,6 +45,7 @@ class MnemonicHandler { private static boolean showMnemonics; private static WeakReference lastShowMnemonicWindow; + private static WindowListener windowListener; static boolean isShowMnemonics() { return showMnemonics || !UIManager.getBoolean( "Component.hideMnemonics" ); @@ -94,12 +99,31 @@ class MnemonicHandler // repaint components with mnemonics in focused window repaintMnemonics( window ); + // hide mnemonics if window is deactivated (e.g. Alt+Tab to another window) + windowListener = new WindowAdapter() { + @Override + public void windowDeactivated( WindowEvent e ) { + // use invokeLater() to avoid that the listener is removed + // while the listener queue is iterated to fire this event + EventQueue.invokeLater( () -> { + showMnemonics( false, c ); + } ); + } + }; + window.addWindowListener( windowListener ); + lastShowMnemonicWindow = new WeakReference<>( window ); } else if( lastShowMnemonicWindow != null ) { Window window = lastShowMnemonicWindow.get(); - if( window != null ) + if( window != null ) { repaintMnemonics( window ); + if( windowListener != null ) { + window.removeWindowListener( windowListener ); + windowListener = null; + } + } + lastShowMnemonicWindow = null; } }