6596966: Some JFileChooser mnemonics do not work with sticky keys
authorrupashka
Fri, 08 Apr 2011 00:26:35 +0400
changeset 9217 f795ef267353
parent 9216 d102bd3f513c
child 9218 883c22142aa9
6596966: Some JFileChooser mnemonics do not work with sticky keys Reviewed-by: alexp
jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java
jdk/test/javax/swing/JLabel/6596966/bug6596966.java
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	Wed Apr 06 20:36:22 2011 +0400
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	Fri Apr 08 00:26:35 2011 +0400
@@ -455,6 +455,8 @@
                 }
                 int dka = label.getDisplayedMnemonic();
                 inputMap.put(KeyStroke.getKeyStroke(dka, ActionEvent.ALT_MASK, true), RELEASE);
+                // Need this when the sticky keys are enabled
+                inputMap.put(KeyStroke.getKeyStroke(dka, 0, true), RELEASE);
                 // Need this if ALT is released before the accelerator
                 inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), RELEASE);
                 label.requestFocus();
@@ -467,7 +469,9 @@
                 InputMap inputMap = SwingUtilities.getUIInputMap(label, JComponent.WHEN_FOCUSED);
                 if (inputMap != null) {
                     // inputMap should never be null.
-                    inputMap.remove(KeyStroke.getKeyStroke(label.getDisplayedMnemonic(), ActionEvent.ALT_MASK, true));
+                    int dka = label.getDisplayedMnemonic();
+                    inputMap.remove(KeyStroke.getKeyStroke(dka, ActionEvent.ALT_MASK, true));
+                    inputMap.remove(KeyStroke.getKeyStroke(dka, 0, true));
                     inputMap.remove(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true));
                 }
                 if (labelFor instanceof Container &&
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JLabel/6596966/bug6596966.java	Fri Apr 08 00:26:35 2011 +0400
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2011, 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
+   @bug 6596966
+   @summary Some JFileChooser mnemonics do not work with sticky keys
+ * @library ../../regtesthelpers
+ * @build Util
+   @run main bug6596966
+   @author Pavel Porvatov
+*/
+
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+
+public class bug6596966 {
+    private static JFrame frame;
+
+    private static JLabel label;
+    private static JButton button;
+    private static JComboBox comboBox;
+
+    public static void main(String[] args) throws Exception {
+        Robot robot = new Robot();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                button = new JButton("Button");
+                comboBox = new JComboBox();
+
+                label = new JLabel("Label");
+                label.setDisplayedMnemonic('L');
+                label.setLabelFor(comboBox);
+
+                JPanel pnContent = new JPanel();
+
+                pnContent.add(button);
+                pnContent.add(label);
+                pnContent.add(comboBox);
+
+                frame = new JFrame();
+
+                frame.add(pnContent);
+                frame.pack();
+                frame.setVisible(true);
+            }
+        });
+
+        Util.blockTillDisplayed(frame);
+
+        robot.keyPress(KeyEvent.VK_ALT);
+        robot.keyPress(KeyEvent.VK_L);
+
+        robot.waitForIdle();
+
+        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new KeyEvent(label, KeyEvent.KEY_RELEASED,
+                EventQueue.getMostRecentEventTime(), 0, KeyEvent.VK_L, 'L'));
+
+        robot.waitForIdle();
+
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    if (!comboBox.isFocusOwner()) {
+                        throw new RuntimeException("comboBox isn't focus owner");
+                    }
+                }
+            });
+        } finally {
+            robot.keyRelease(KeyEvent.VK_ALT);
+        }
+    }
+}