1 /* 2 * Copyright (c) 2015, 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 /* 25 * @test @bug 8037575 26 * @summary JFrame doesn't animate when setting ICONIFIED state 27 * @requires (os.family == "windows") 28 * @run main/manual bug8037575 29 */ 30 import java.awt.Frame; 31 import javax.swing.JFrame; 32 import javax.swing.SwingUtilities; 33 import java.awt.*; 34 import java.awt.event.*; 35 import java.util.logging.Level; 36 import java.util.logging.Logger; 37 import javax.swing.AbstractAction; 38 import javax.swing.JButton; 39 import javax.swing.JDialog; 40 import javax.swing.Timer; 41 42 public class bug8037575 { 43 44 private static boolean theTestPassed; 45 private static boolean testGeneratedInterrupt; 46 private static Thread mainThread; 47 private static int sleepTime = 30000; 48 private static int waitTime = 2000; 49 private final static JFrame frame = new JFrame("bug8037575"); 50 51 private static void init() throws Exception { 52 53 SwingUtilities.invokeAndWait(new Runnable() { 54 @Override 55 public void run() { 56 String[] instructions 57 = { 58 "1) You see a dialog with buttons and text area.", 59 "2) Pressing Run button will start test. A new Frame will open automatically" 60 + " and minimize after 2 seconds.", 61 "3) Frame should minimize gradually with animation effect.", 62 "4) If frame disappers without animation then test " 63 + "failed otherwise passed.", 64 "5) Pressing Pass/Fail button will mark test as " 65 + "pass/fail and will shutdown JVM as well"}; 66 67 Sysout.createDialogWithInstructions(instructions); 68 Sysout.printInstructions(instructions); 69 } 70 }); 71 } 72 73 /** 74 * *************************************************** 75 * Standard Test Machinery Section DO NOT modify anything in this section -- 76 * it's a standard chunk of code which has all of the synchronisation 77 * necessary for the test harness. By keeping it the same in all tests, it 78 * is easier to read and understand someone else's test, as well as insuring 79 * that all tests behave correctly with the test harness. There is a section 80 * following this for test-defined classes 81 */ 82 public static void main(String args[]) throws InterruptedException { 83 84 mainThread = Thread.currentThread(); 85 try { 86 init(); 87 } catch (Exception ex) { 88 Logger.getLogger(bug8037575.class.getName()).log(Level.SEVERE, null, ex); 89 } 90 try { 91 mainThread.sleep(sleepTime); 92 } catch (InterruptedException ex) { 93 Sysout.dispose(); 94 if (!theTestPassed && testGeneratedInterrupt) { 95 throw new RuntimeException("Test Failed"); 96 } 97 } 98 if (!testGeneratedInterrupt) { 99 Sysout.dispose(); 100 throw new RuntimeException("Test Failed"); 101 } 102 } 103 104 public static synchronized void pass() { 105 theTestPassed = true; 106 testGeneratedInterrupt = true; 107 mainThread.interrupt(); 108 } 109 110 public static synchronized void runTest() { 111 frame.setSize(800, 600); 112 frame.setVisible(true); 113 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 114 Timer timer = new Timer(waitTime, new AbstractAction() { 115 @Override 116 public void actionPerformed(ActionEvent ae) { 117 frame.setExtendedState(Frame.ICONIFIED); 118 frame.dispose(); 119 Sysout.println("Test completed please press/fail button"); 120 } 121 }); 122 timer.setRepeats(false); 123 timer.start(); 124 } 125 126 public static synchronized void fail() { 127 theTestPassed = false; 128 testGeneratedInterrupt = true; 129 mainThread.interrupt(); 130 } 131 } 132 133 /** 134 * This is part of the standard test machinery. It creates a dialog (with the 135 * instructions), and is the interface for sending text messages to the user. To 136 * print the instructions, send an array of strings to Sysout.createDialog 137 * WithInstructions method. Put one line of instructions per array entry. To 138 * display a message for the tester to see, simply call Sysout.println with the 139 * string to be displayed. This mimics System.out.println but works within the 140 * test harness as well as standalone. 141 */ 142 class Sysout { 143 144 private static TestDialog dialog; 145 private static JFrame frame; 146 147 public static void createDialogWithInstructions(String[] instructions) { 148 frame = new JFrame(); 149 dialog = new TestDialog(frame, "Instructions"); 150 dialog.printInstructions(instructions); 151 dialog.setVisible(true); 152 println("Any messages for the tester will display here."); 153 } 154 155 public static void printInstructions(String[] instructions) { 156 dialog.printInstructions(instructions); 157 } 158 159 public static void println(String messageIn) { 160 dialog.displayMessage(messageIn); 161 } 162 163 public static void dispose() { 164 Sysout.println("Shutting down the Java process.."); 165 frame.dispose(); 166 dialog.dispose(); 167 } 168 } 169 170 /** 171 * This is part of the standard test machinery. It provides a place for the test 172 * instructions to be displayed, and a place for interactive messages to the 173 * user to be displayed. To have the test instructions displayed, see Sysout. To 174 * have a message to the user be displayed, see Sysout. Do not call anything in 175 * this dialog directly. 176 */ 177 class TestDialog extends JDialog { 178 179 private TextArea instructionsText; 180 private TextArea messageText; 181 private int maxStringLength = 80; 182 private Panel buttonP = new Panel(); 183 private JButton run = new JButton("Run"); 184 private JButton passB = new JButton("Pass"); 185 private JButton failB = new JButton("Fail"); 186 187 public TestDialog(JFrame frame, String name) { 188 super(frame, name); 189 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 190 int scrollBoth = TextArea.SCROLLBARS_BOTH; 191 instructionsText = new TextArea("", 15, maxStringLength, scrollBoth); 192 add("North", instructionsText); 193 194 messageText = new TextArea("", 5, maxStringLength, scrollBoth); 195 add("Center", messageText); 196 197 buttonP.add("East", run); 198 buttonP.add("East", passB); 199 buttonP.add("West", failB); 200 passB.setEnabled(false); 201 failB.setEnabled(false); 202 add("South", buttonP); 203 204 run.addActionListener(new ActionListener() { 205 206 @Override 207 public void actionPerformed(ActionEvent ae) { 208 bug8037575.runTest(); 209 passB.setEnabled(true); 210 failB.setEnabled(true); 211 } 212 }); 213 214 passB.addActionListener(new ActionListener() { 215 216 @Override 217 public void actionPerformed(ActionEvent ae) { 218 bug8037575.pass(); 219 } 220 }); 221 222 failB.addActionListener(new ActionListener() { 223 224 @Override 225 public void actionPerformed(ActionEvent ae) { 226 bug8037575.fail(); 227 } 228 }); 229 pack(); 230 231 setVisible(true); 232 } 233 234 public void printInstructions(String[] instructions) { 235 instructionsText.setText(""); 236 String printStr, remainingStr; 237 for (String instruction : instructions) { 238 remainingStr = instruction; 239 while (remainingStr.length() > 0) { 240 if (remainingStr.length() >= maxStringLength) { 241 int posOfSpace = remainingStr. 242 lastIndexOf(' ', maxStringLength - 1); 243 244 if (posOfSpace <= 0) { 245 posOfSpace = maxStringLength - 1; 246 } 247 248 printStr = remainingStr.substring(0, posOfSpace + 1); 249 remainingStr = remainingStr.substring(posOfSpace + 1); 250 } else { 251 printStr = remainingStr; 252 remainingStr = ""; 253 } 254 instructionsText.append(printStr + "\n"); 255 } 256 } 257 258 } 259 260 public void displayMessage(String messageIn) { 261 messageText.append(messageIn + "\n"); 262 } 263 }