--- /dev/null 2014-05-30 11:03:42.395385429 +0400 +++ new/test/java/awt/Frame/DisposeParentGC/DisposeParentGC.java 2014-06-03 14:51:38.300806890 +0400 @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2014, 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. + */ + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.lang.ref.PhantomReference; +import java.lang.ref.ReferenceQueue; +import java.util.ArrayList; +import java.util.Vector; + +/* + * @test + * @summary Display a dialog with a parent, the dialog contains all awt components + * added to it & each components are setted with different cursors types. + * Dispose the parent & collect GC. Garbage collection should happen + * @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com) + * @library ../../../../lib/testlibrary + * @build ExtendedRobot + * @run main DisposeParentGC + */ + +public class DisposeParentGC { + Frame parentFrame; + ExtendedRobot robot; + + ArrayList> refs = new ArrayList>(); + ReferenceQueue que = new ReferenceQueue<>(); + + public static void main(String []args) throws Exception { + new DisposeParentGC().doTest(); + } + + DisposeParentGC() throws Exception { + robot = new ExtendedRobot(); + EventQueue.invokeAndWait(this::initGui); + } + + void initGui(){ + parentFrame = new Frame("Parent Frame"); + parentFrame.setLayout(new FlowLayout()); + + for (int i = 1; i <= 3; i++) + createDialog(i); + + parentFrame.setLocation(250, 20); + parentFrame.pack(); + parentFrame.setVisible(true); + } + + public void doTest() throws Exception{ + robot.waitForIdle(); + + parentFrame.dispose(); + robot.waitForIdle(); + + Vector garbage = new Vector(); + while (true) { + try { + garbage.add(new byte[1000]); + } catch (OutOfMemoryError er) { + break; + } + } + garbage = null; + + int count = 1; + for (; count <= 3; count++) + if(que.remove(5000) == null) + break; + + if (count < 3) + throw new RuntimeException("Count = "+count+". GC didn't collect the objects after the parent is disposed!"); + } + + public void createDialog(int number) { + Dialog child = new Dialog(parentFrame); + child.setTitle("Dialog " + number); + child.setLayout(new FlowLayout()); + child.setLocation(20, 140 * number); + + Button button = new Button("Press Me") ; + TextArea textArea = new TextArea(5,5); + TextField textField = new TextField(10); + Choice choice = new Choice(); + choice.add("One"); + choice.add("Two"); + choice.add("Three"); + choice.add("Four"); + choice.add("Five"); + List list = new List(); + list.add("One"); + list.add("Two"); + list.add("Three"); + list.add("Four"); + list.add("Five"); + Checkbox checkBox = new Checkbox("Hai"); + Scrollbar scrollBar = new Scrollbar(Scrollbar.VERTICAL,0,1,0,200); + CheckboxGroup checkboxGroup = new CheckboxGroup(); + Checkbox radioButton = new Checkbox("Hello" ,true, checkboxGroup); + Canvas canvas = new Canvas(); + Label label = new Label("I am label!"); + Cursor customCursor = null; + + child.setLayout(new FlowLayout()); + canvas.setSize(100,100); + canvas.setBackground(Color.red); + + button.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); + label.setCursor(new Cursor(Cursor.TEXT_CURSOR)); + choice.setCursor(new Cursor(Cursor.WAIT_CURSOR)); + list.setCursor(new Cursor(Cursor.HAND_CURSOR)); + checkBox.setCursor(new Cursor(Cursor.MOVE_CURSOR)); + radioButton.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR)); + scrollBar.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR)); + canvas.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR)); + textField.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + + /* create a custom cursor */ + Toolkit toolkit = Toolkit.getDefaultToolkit(); + Dimension d = toolkit.getBestCursorSize(32,32); + int color = toolkit.getMaximumCursorColors(); + + if(!d.equals(new Dimension(0,0)) && color != 0 ) + customCursor = toolkit.createCustomCursor(new BufferedImage( 16, 16, BufferedImage.TYPE_INT_RGB ), new Point(10, 10), "custom cursor."); + else + System.err.println("Platform doesn't support to create a custom cursor."); + + textArea.setCursor(customCursor); + child.add(label); + child.add(button); + child.add(choice); + child.add(list); + child.add(checkBox); + child.add(radioButton); + child.add(scrollBar); + child.add(canvas); + child.add(textArea); + child.add(textField); + child.add(button); + child.revalidate(); + + child.pack(); + child.setVisible(true); + refs.add(new PhantomReference(child, que)); + } +}