# HG changeset patch # User aghaisas # Date 1467110828 -19800 # Node ID fe4d6551efcacb02a21a1986e1c24ff16ac0c549 # Parent 855ab97cde5aa9c07ba31b6514e94811fcdca712 8065861: Pressing Esc does not set 'canceled' property of ProgressMonitor Reviewed-by: alexsch, prr diff -r 855ab97cde5a -r fe4d6551efca jdk/src/java.desktop/share/classes/javax/swing/ProgressMonitor.java --- a/jdk/src/java.desktop/share/classes/javax/swing/ProgressMonitor.java Mon Jun 27 10:01:23 2016 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/ProgressMonitor.java Tue Jun 28 16:17:08 2016 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -369,16 +369,24 @@ /** - * Returns true if the user hits the Cancel button in the progress dialog. + * Returns true if the user hits the Cancel button or closes + * the progress dialog. * - * @return true if the user hits the Cancel button in the progress dialog + * @return true if the user hits the Cancel button or closes + * the progress dialog */ public boolean isCanceled() { - if (pane == null) return false; + if (pane == null) { + return false; + } + Object v = pane.getValue(); - return ((v != null) && - (cancelOption.length == 1) && - (v.equals(cancelOption[0]))); + if (v == null) { + return false; + } + + return (((cancelOption.length == 1) && v.equals(cancelOption[0])) || + v.equals(Integer.valueOf(JOptionPane.CLOSED_OPTION))); } diff -r 855ab97cde5a -r fe4d6551efca jdk/test/javax/swing/ProgressMonitor/ProgressMonitorEscapeKeyPress.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/ProgressMonitor/ProgressMonitorEscapeKeyPress.java Tue Jun 28 16:17:08 2016 +0530 @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016, 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 8065861 + * @summary Test to check pressing Escape key sets 'canceled' property of ProgressMonitor + * @run main ProgressMonitorEscapeKeyPress + */ + +import java.awt.AWTException; +import java.awt.EventQueue; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import javax.swing.JFrame; +import javax.swing.ProgressMonitor; +import javax.swing.SwingUtilities; + +public class ProgressMonitorEscapeKeyPress { + + static ProgressMonitor monitor; + static int counter = 0; + static TestThread robotThread; + static JFrame frame; + + + public static void main(String[] args) throws Exception { + + createTestUI(); + + monitor = new ProgressMonitor(frame, "Progress", null, 0, 100); + + robotThread = new TestThread(); + robotThread.start(); + + for (counter = 0; counter <= 100; counter += 10) { + Thread.sleep(1000); + + EventQueue.invokeAndWait(new Runnable() { + @Override + public void run() { + if (!monitor.isCanceled()) { + monitor.setProgress(counter); + System.out.println("Progress bar is in progress"); + } + } + }); + + if (monitor.isCanceled()) { + break; + } + } + + disposeTestUI(); + + if (counter >= monitor.getMaximum()) { + throw new RuntimeException("Escape key did not cancel the ProgressMonitor"); + } + } + + private static void createTestUI() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + frame = new JFrame("Test"); + frame.setSize(300, 300); + frame.setLocationByPlatform(true); + frame.setVisible(true); + }}); + } + + + private static void disposeTestUI() throws Exception { + SwingUtilities.invokeAndWait(() -> { + frame.dispose(); + }); + } +} + + +class TestThread extends Thread { + + Robot testRobot; + + TestThread() throws AWTException { + super(); + testRobot = new Robot(); + } + + @Override + public void run() { + try { + // Sleep for 5 seconds - so that the ProgressMonitor starts + Thread.sleep(5000); + + // Press and release Escape key + testRobot.keyPress(KeyEvent.VK_ESCAPE); + testRobot.delay(20); + testRobot.keyRelease(KeyEvent.VK_ESCAPE); + } catch (InterruptedException ex) { + throw new RuntimeException("Exception in TestThread"); + } + } +} +