1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /* @test
  25    @bug 8173145
  26    @requires (os.family == "windows")
  27    @summary Menu is activated after using mnemonic Alt/Key combination
  28    @modules java.desktop/com.sun.java.swing.plaf.windows
  29    @run main Test8173145
  30 */
  31 
  32 import java.awt.*;
  33 import java.awt.event.KeyEvent;
  34 import java.lang.reflect.InvocationTargetException;
  35 
  36 import javax.swing.*;
  37 
  38 public class Test8173145 {
  39 
  40     private volatile static JButton btn;
  41     private volatile static boolean uiCreated;
  42 
  43     public static void main(String[] args) throws InvocationTargetException, InterruptedException, AWTException {
  44         SwingUtilities.invokeAndWait(new Runnable() {
  45             @Override
  46             public void run() {
  47                 try {
  48                     uiCreated = createGUI();
  49                 } catch (Exception e) {
  50                     e.printStackTrace();
  51                 }
  52             }
  53         });
  54 
  55         if (uiCreated) {
  56             test();
  57         } else {
  58             //no windows l&f, skip the test
  59         }
  60     }
  61 
  62     private static void test() {
  63         final Robot robot;
  64         try {
  65             robot = new Robot();
  66         } catch (AWTException e) {
  67             throw new RuntimeException(e);
  68         }
  69         robot.setAutoDelay(100);
  70         robot.waitForIdle();
  71 
  72         robot.keyPress(KeyEvent.VK_ALT);
  73         robot.keyPress(KeyEvent.VK_M);
  74         robot.keyRelease(KeyEvent.VK_M);
  75         robot.keyRelease(KeyEvent.VK_ALT);
  76 
  77         Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
  78 
  79         if (focusOwner != btn) {
  80             throw new RuntimeException("Wrong focus owner");
  81         }
  82     }
  83 
  84     private static boolean createGUI() {
  85         try {
  86             UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
  87         } catch (Exception e) {
  88             return false;
  89         }
  90         JFrame f = new JFrame();
  91 
  92         JPanel panel = new JPanel();
  93         btn = new JButton("Mmmmm");
  94         btn.setMnemonic(KeyEvent.VK_M);
  95         btn.setDisplayedMnemonicIndex(0);
  96         panel.add(btn);
  97 
  98         JTextField tf = new JTextField();
  99         tf.setColumns(10);
 100         panel.add(tf);
 101 
 102         f.setJMenuBar(getMenuBar());
 103         f.add(panel);
 104         f.pack();
 105         f.setVisible(true);
 106         tf.requestFocus();
 107         return true;
 108     }
 109 
 110     static JMenuBar getMenuBar() {
 111         JMenuBar menuBar;
 112         JMenu menu;
 113 
 114         menuBar = new JMenuBar();
 115 
 116         menu = new JMenu("Menu");
 117         menuBar.add(menu);
 118 
 119         JMenuItem mi = new JMenuItem("test");
 120         menu.add(mi);
 121 
 122         return menuBar;
 123     }
 124 }