Désactiver l’action de touche ALT par défaut dans JFrame sous Windows

Je voudrais laisser mon JFrame sous Windows ne pas agir sur une touche de la touche ALT . Pour clarifier, lorsque vous exécutez l’extrait de code suivant:

 import javax.swing.*; public class FrameTest { public static void main(Ssortingng[] args) throws Exception { JFrame frame = new JFrame(); frame.setSize(400, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 

et appuyez sur la touche ALT puis arrow down touche arrow down le arrow down , vous obtenez un menu dans le coin supérieur gauche dans lequel vous pouvez choisir de minimiser, déplacer, fermer etc. Je voudrais désactiver ceci: ie. JFrame ne doit pas “écouter” ces presses ALT .

Je crois que certains composants Windows réagissent par défaut sur la touche ALT car lorsque j’ajoute une barre de menu à mon cadre et que je lui atsortingbue explicitement l’apparence, le menu ( File ) est automatiquement sélectionné après avoir appuyé sur la touche. Touche ALT :

 import javax.swing.*; public class FrameTest { public static void main(Ssortingng[] args) throws Exception { JFrame frame = new JFrame(); frame.setSize(400, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("File"); menuBar.add(menu); frame.setJMenuBar(menuBar); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // set Windows look and feel frame.setVisible(true); } } 

et lorsque je supprime UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) de l’exemple ci-dessus, ce comportement n’est pas affiché lorsque vous appuyez sur la touche ALT : le menu n’est pas sélectionné, mais JFrame l’ est .

Quand aucun look & feel n’est défini, l’apparence “Metal” est utilisée. Il est clair en regardant la barre de menu de mon exemple précédent que vous allez de “look natif” à “Metal look” lorsque vous supprimez UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) du code. Cependant, je ne vois pas de changement dans le JFrame, quel que soit le look que j’ai défini, il ressemble toujours à un cadre Windows natif.

Donc, ma question est la suivante: comment puis-je désactiver ce comportement ALT sur mon JFrame? Je suppose que je peux le faire en changeant réellement l’apparence du JFrame. Est-ce possible? Si c’est le cas, comment?

Merci!

En fait, ce que vous voyez ici se situe à peu près au-delà de votre beau monde de Java Swing-y. Le cadre de la fenêtre (à l’exception des interfaces MDI) sera toujours dessiné par le gestionnaire de fenêtres du système d’exploitation sous-jacent. Et c’est aussi la raison pour laquelle la touche Alt se comporte comme vous observez. Cette clé est interceptée par le WM dans ce cas et il décide que vous souhaitez afficher le menu système du programme. C’est totalement indépendant de Java.

Pour plusieurs raisons, vous ne pouvez pas changer l’apparence du cadre de la fenêtre, le principal étant qu’il ne s’agit pas du système PLAF de Swing. Vous pouvez retirer le cadre de la fenêtre en laissant une fenêtre nue (qui gèle dans le vent froid de novembre), vous ne devriez plus avoir de menu système.

De plus, vous pouvez essayer de manipuler la touche Alt et ne pas déléguer davantage cette touche (l’application l’obtient avant le WM, vous pouvez donc vous occuper de ces choses). Mon Java-Fu est un peu rouillé en ce moment, donc aucune idée si et comment cela peut être réalisé.

Juste pour l’histoire:

Tu peux le faire. Le gestionnaire de fenêtres gère tous les événements pour le gestionnaire de focus clavier en cours et décide de ce qu’il faut faire avec la clé particulière. Chaque application de swing dispose d’un seul gestionnaire de focus clavier, ce qui explique pourquoi vos modifications affecteront l’ensemble de l’application et non le cadre particulier. Le code ci-dessous devrait faire l’affaire:

 frame.addFocusListener(new FocusListener() { private final KeyEventDispatcher altDisabler = new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { return e.getKeyCode() == 18; } }; @Override public void focusGained(FocusEvent e) { KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(altDisabler); } @Override public void focusLost(FocusEvent e) { KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(altDisabler); } }); 

Il semblerait que vous interagissiez avec le gestionnaire de fenêtres Windows. Il est possible que si vous dessinez votre propre barre de titre et bordures, Windows ne définira plus ces gestionnaires par défaut sur la touche Alt.

Vous pourriez vouloir essayer Substance , qui vous donne beaucoup plus de contrôle sur ce genre de choses, tout en travaillant avec les composants Swing standard.

Ou essayez ceci avant de rendre votre cadre visible:

 JFrame.setDefaultLookAndFeelDecorated(true);