ComponentIsNotDrawnAfterRemoveAddTest.java revision 14851:980da45565c8
1
2/*
3 * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/*
26 * @test
27 * @key headful
28 * @bug 8139581
29 * @summary AWT components are not drawn after removal and addition to a container
30 * @author Anton Litvinov
31 */
32
33import java.awt.Button;
34import java.awt.Color;
35import java.awt.Canvas;
36import java.awt.Frame;
37import java.awt.Graphics;
38import java.awt.Panel;
39import java.util.ArrayList;
40
41public class ComponentIsNotDrawnAfterRemoveAddTest {
42    private final Frame frame;
43    private final Panel panel;
44    private final ArrayList<Testable> compList = new ArrayList<Testable>();
45
46    public ComponentIsNotDrawnAfterRemoveAddTest() {
47        frame = new Frame("ComponentIsNotDrawnAfterRemoveAddTest");
48        frame.setSize(500, 500);
49        frame.setLocation(200, 200);
50        frame.setLayout(null);
51        frame.setBackground(Color.RED);
52
53        panel = new Panel();
54        panel.setLayout(null);
55        panel.setBounds(25, 100, 455, 295);
56        panel.setBackground(Color.GREEN);
57
58        for (int i = 0; i < 10; i++) {
59            TestCanvas canv1 = new TestCanvas();
60            canv1.setBounds(i * 45 + 5, 15, 30 + i, 30 + i);
61            panel.add(canv1);
62            compList.add(canv1);
63
64            TestButton btn1 = new TestButton();
65            btn1.setBounds(i * 45 + 5, 60, 30 + i, 30 + i);
66            panel.add(btn1);
67            compList.add(btn1);
68
69            TestCanvas canv2 = new TestCanvas();
70            canv2.setBounds(i * 45 + 5, 105, 30 + i, 30 + i);
71            panel.add(canv2);
72            compList.add(canv2);
73
74            TestButton btn2 = new TestButton();
75            btn2.setBounds(i * 45 + 5, 150, 30 + i, 30 + i);
76            panel.add(btn2);
77            compList.add(btn2);
78
79            TestCanvas canv3 = new TestCanvas();
80            canv3.setBounds(i * 45 + 5, 195, 30 + i, 30 + i);
81            panel.add(canv3);
82            compList.add(canv3);
83
84            TestButton btn3 = new TestButton();
85            btn3.setBounds(i * 45 + 5, 240, 30 + i, 30 + i);
86            panel.add(btn3);
87            compList.add(btn3);
88        }
89
90        frame.add(panel);
91        frame.setVisible(true);
92    }
93
94    private void runTest() {
95        try {
96            doSleep(1500);
97            checkTestableComponents();
98
99            for (int i = 0; i < 5; i++) {
100                System.err.println(String.format("Test iteration #%d:", i));
101
102                frame.remove(panel);
103                frame.invalidate();
104                frame.validate();
105                frame.add(panel);
106
107                doSleep(1500);
108                checkTestableComponents();
109            }
110        } finally {
111            frame.dispose();
112        }
113    }
114
115    private void doSleep(long millis) {
116        try {
117            Thread.sleep(millis);
118        } catch (InterruptedException ie) {
119            ie.printStackTrace();
120        }
121    }
122
123    private void checkTestableComponents() throws RuntimeException {
124        int notDrawnCompsCount = 0;
125        for (Testable comp : compList) {
126            if (!comp.wasPaintCalled()) {
127                notDrawnCompsCount++;
128            } else {
129                comp.resetPaintCalledFlag();
130            }
131        }
132        if (notDrawnCompsCount > 0) {
133            throw new RuntimeException(String.format(
134                "'paint' method of %d components was not called.", notDrawnCompsCount));
135        }
136    }
137
138    private interface Testable {
139        boolean wasPaintCalled();
140        void resetPaintCalledFlag();
141    }
142
143    private static class TestCanvas extends Canvas implements Testable {
144        private volatile boolean paintWasCalled = false;
145
146        @Override
147        public void paint(Graphics g) {
148            paintWasCalled = true;
149            super.paint(g);
150            g.setColor(Color.BLUE);
151            g.fillRect(0, 0, getWidth(), getHeight());
152        }
153
154        @Override
155        public boolean wasPaintCalled() {
156            return paintWasCalled;
157        }
158
159        @Override
160        public void resetPaintCalledFlag() {
161            paintWasCalled = false;
162        }
163    }
164
165    private static class TestButton extends Button implements Testable {
166        private volatile boolean paintWasCalled = false;
167
168        @Override
169        public void paint(Graphics g) {
170            paintWasCalled = true;
171            super.paint(g);
172            g.setColor(Color.YELLOW);
173            g.fillRect(0, 0, 15, 15);
174        }
175
176        @Override
177        public boolean wasPaintCalled() {
178            return paintWasCalled;
179        }
180
181        @Override
182        public void resetPaintCalledFlag() {
183            paintWasCalled = false;
184        }
185    }
186
187    public static void main(String[] args) {
188        new ComponentIsNotDrawnAfterRemoveAddTest().runTest();
189    }
190}
191