From d6961045353897967bb734740225bd1cddf158e5 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Wed, 7 Sep 2022 12:34:38 +0000 Subject: [PATCH] 4850101: Setting mnemonic to VK_F4 underlines the letter S in a button. Reviewed-by: prr --- .../classes/javax/swing/SwingUtilities.java | 4 + .../swing/JButton/TestMnemonicAction.java | 125 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 test/jdk/javax/swing/JButton/TestMnemonicAction.java diff --git a/src/java.desktop/share/classes/javax/swing/SwingUtilities.java b/src/java.desktop/share/classes/javax/swing/SwingUtilities.java index 1d58541dfee..2a7c2bc8cc9 100644 --- a/src/java.desktop/share/classes/javax/swing/SwingUtilities.java +++ b/src/java.desktop/share/classes/javax/swing/SwingUtilities.java @@ -2073,6 +2073,10 @@ public class SwingUtilities implements SwingConstants return -1; } + if (mnemonic >= 'a' && mnemonic <= 'z') { + return -1; + } + char uc = Character.toUpperCase((char)mnemonic); char lc = Character.toLowerCase((char)mnemonic); diff --git a/test/jdk/javax/swing/JButton/TestMnemonicAction.java b/test/jdk/javax/swing/JButton/TestMnemonicAction.java new file mode 100644 index 00000000000..e2621f14541 --- /dev/null +++ b/test/jdk/javax/swing/JButton/TestMnemonicAction.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2022, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 4850101 + * @summary Verifies if Setting mnemonic to VK_F4 underlines the letter S. + * @run main TestMnemonicAction + */ + +import java.io.File; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; + +public class TestMnemonicAction { + private static JFrame f; + private static JButton b; + + public static boolean compareBufferedImages(BufferedImage bufferedImage0, + BufferedImage bufferedImage1) { + int width = bufferedImage0.getWidth(); + int height = bufferedImage0.getHeight(); + + if (width != bufferedImage1.getWidth() || height != bufferedImage1.getHeight()) { + return false; + } + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + if (bufferedImage0.getRGB(x, y) != bufferedImage1.getRGB(x, y)) { + return false; + } + } + } + + return true; + } + + public static void main(String[] args) throws Exception { + + SwingUtilities.invokeAndWait(() -> { + f = new JFrame(); + b = new JButton("Shutdown"); + b.setMnemonic(KeyEvent.VK_F4); + b.setPreferredSize(new Dimension(100, 25)); + b.setToolTipText("Shutdown"); + f.getContentPane().add(b); + f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); + f.setUndecorated(true); + f.setLocationRelativeTo(null); + f.pack(); + f.setVisible(true); + }); + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + Point p = b.getLocationOnScreen(); + BufferedImage imgmnemonic = robot.createScreenCapture( + new Rectangle(p.x, p.y, b.getWidth(), b.getHeight())); + robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + SwingUtilities.invokeAndWait(() -> { + f = new JFrame(); + b = new JButton("Shutdown"); + b.setPreferredSize(new Dimension(100, 25)); + f.getContentPane().add(b); + f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); + f.setUndecorated(true); + f.setLocationRelativeTo(null); + f.pack(); + f.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + p = b.getLocationOnScreen(); + BufferedImage buttonimage = robot.createScreenCapture( + new Rectangle(p.x, p.y, b.getWidth(), b.getHeight())); + robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + if (!compareBufferedImages(imgmnemonic, buttonimage)) { + ImageIO.write(imgmnemonic, "png", new File("imgmnemonic.png")); + ImageIO.write(buttonimage, "png", new File("buttonimage.png")); + throw new RuntimeException("F4 mnemonic underlines S"); + } + } +} +