diff -r b9456394d24f -r 86897f8a6598 test/jdk/javax/swing/event/RightAltKeyTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/javax/swing/event/RightAltKeyTest.java Mon Jun 25 12:50:25 2018 +0530 @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @key headful + * @bug 8194873 + * @requires (os.family == "Windows") + * @summary Checks that right ALT (ALT_GRAPH) key works on Swing components + * @run main RightAltKeyTest + */ + +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.JLabel; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.KeyStroke; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.GridLayout; +import java.awt.Robot; +import java.lang.reflect.InvocationTargetException; + +public class RightAltKeyTest { + + boolean action = false; + JFrame frame; + + void testJMenu() { + frame = new JFrame("Menu Frame"); + JMenuBar mb = new JMenuBar(); + JMenu m1 = new JMenu("File"); + JMenuItem i1 = new JMenuItem("Save"); + JMenuItem i2 = new JMenuItem("Load"); + + m1.setMnemonic(KeyEvent.VK_F); + + m1.addMenuListener(new MenuListener() { + @Override + public void menuSelected(MenuEvent e) { + action = true; + disposeUI(); + } + + @Override + public void menuDeselected(MenuEvent e) { + } + + @Override + public void menuCanceled(MenuEvent e) { + } + }); + + frame.setJMenuBar(mb); + mb.add(m1); + m1.add(i1); + m1.add(i2); + + frame.setSize(200, 200); + frame.setVisible(true); + } + + void testJMenuItem() { + frame = new JFrame("Menu Frame"); + JMenuBar mb = new JMenuBar(); + JMenu m1 = new JMenu("File"); + JMenuItem i1 = new JMenuItem("Save"); + i1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, + InputEvent.ALT_GRAPH_DOWN_MASK)); + i1.addActionListener((e) -> { + action = true; + disposeUI(); + }); + + frame.setJMenuBar(mb); + mb.add(m1); + m1.add(i1); + + frame.setSize(200, 200); + frame.setVisible(true); + } + + void testJOptionPane() { + int selection = JOptionPane.showConfirmDialog(null, "Do you wish " + + "to save file?","Confirm", JOptionPane.YES_NO_CANCEL_OPTION); + //Pressed Yes + if (selection == 0) { + action = true; + } + } + + void testJTabbedPane() { + frame =new JFrame(); + JPanel p1=new JPanel(); + JPanel p2=new JPanel(); + JTabbedPane tp=new JTabbedPane(); + tp.add("Main",p1); + tp.add("Visit",p2); + tp.setMnemonicAt(0, KeyEvent.VK_M); + tp.setMnemonicAt(1, KeyEvent.VK_V); + + tp.addChangeListener((e) -> { + if (tp.getSelectedIndex() == 1) + action = true; + disposeUI(); + }); + + frame.add(tp); + frame.setSize(200,200); + frame.setVisible(true); + } + + void testJTextArea() { + JTextField firstField = new JTextField(10); + JTextField lastField = new JTextField(10); + + JLabel firstLabel = new JLabel("First Name", JLabel.RIGHT); + firstLabel.setDisplayedMnemonic('F'); + firstLabel.setLabelFor(firstField); + + JLabel lastLabel = new JLabel("Last Name", JLabel.RIGHT); + lastLabel.setDisplayedMnemonic('L'); + lastLabel.setLabelFor(lastField); + + JPanel p = new JPanel(); + p.setLayout(new GridLayout(2, 2, 5, 5)); + p.add(firstLabel); + p.add(firstField); + p.add(lastLabel); + p.add(lastField); + + frame = new JFrame("MnemonicLabels"); + lastField.addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + action = true; + disposeUI(); + } + + @Override + public void focusLost(FocusEvent e) { + + } + }); + + frame.add(p); + frame.setSize(200,200); + frame.setVisible(true); + } + + void test() throws Exception { + UIManager.LookAndFeelInfo[] lookAndFeels = UIManager + .getInstalledLookAndFeels(); + for (UIManager.LookAndFeelInfo lookAndFeel : lookAndFeels) { + UIManager.setLookAndFeel(lookAndFeel.getClassName()); + + Robot robot = new Robot(); + robot.setAutoDelay(100); + robot.waitForIdle(); + + action = false; + SwingUtilities.invokeLater(this::testJMenu); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_ALT_GRAPH); + robot.keyPress(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_ALT_GRAPH); + robot.waitForIdle(); + if (!action) + errLog("JMenu", lookAndFeel.getClassName()); + + action = false; + SwingUtilities.invokeLater(this::testJMenuItem); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_ALT_GRAPH); + robot.keyPress(KeyEvent.VK_S); + robot.keyRelease(KeyEvent.VK_S); + robot.keyRelease(KeyEvent.VK_ALT_GRAPH); + robot.waitForIdle(); + if (!action) + errLog("JMenuItem", lookAndFeel.getClassName()); + + action = false; + SwingUtilities.invokeLater(this::testJOptionPane); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_ALT_GRAPH); + robot.keyPress(KeyEvent.VK_Y); + robot.keyRelease(KeyEvent.VK_Y); + robot.keyRelease(KeyEvent.VK_ALT_GRAPH); + robot.waitForIdle(); + if (!action) + errLog("JOptionPane", lookAndFeel.getClassName()); + + action = false; + SwingUtilities.invokeLater(this::testJTabbedPane); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_ALT_GRAPH); + robot.keyPress(KeyEvent.VK_V); + robot.keyRelease(KeyEvent.VK_V); + robot.keyRelease(KeyEvent.VK_ALT_GRAPH); + robot.waitForIdle(); + if (!action) + errLog("JTabbedPane", lookAndFeel.getClassName()); + + action = false; + SwingUtilities.invokeLater(this::testJTextArea); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_ALT_GRAPH); + robot.keyPress(KeyEvent.VK_L); + robot.keyRelease(KeyEvent.VK_L); + robot.keyRelease(KeyEvent.VK_ALT_GRAPH); + robot.waitForIdle(); + if (!action) + errLog("JTextArea", lookAndFeel.getClassName()); + } + System.out.println("Passed."); + } + + void disposeUI() { + frame.setVisible(false); + frame.dispose(); + } + + void errLog(String componentName, String lookAndFeel) + throws InvocationTargetException, InterruptedException + { + SwingUtilities.invokeAndWait(this::disposeUI); + throw new RuntimeException("Actions are not performed for "+ + componentName + " with " + lookAndFeel + " look and feel."); + } + + public static void main(String[] args) throws Exception { + RightAltKeyTest t = new RightAltKeyTest(); + t.test(); + } +}