1 /*
2  * Copyright (c) 2016, 2017, 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
26  * @key headful
27  * @bug 8160246
28  * @summary Regression: 4410243 reproducible with GTK LaF
29  * @run main ScrollFlickerTest
30  */
31 
32 import javax.swing.*;
33 import java.awt.*;
34 
35 public class ScrollFlickerTest {
36 
37     private static JFrame frame;
38     private static JScrollPane scroll;
39     private static int cnt = 0;
40 
main(String[] args)41     public static void main(String[] args) throws Exception {
42         SwingUtilities.invokeAndWait(() -> {
43             frame = new JFrame();
44             frame.setSize(300, 200);
45             frame.getContentPane().setLayout(null);
46             JTextArea text = new JTextArea("Test test test test");
47             text.setLineWrap(true);
48             scroll = new JScrollPane(text);
49             frame.getContentPane().add(scroll);
50             scroll.setBounds(1, 1, 100, 50);
51             frame.setVisible(true);
52         });
53 
54         Robot robot = new Robot();
55         robot.waitForIdle();
56         robot.delay(200);
57 
58         SwingUtilities.invokeAndWait(() -> {
59             Insets insets = scroll.getInsets();
60             scroll.setSize(insets.left + insets.right +
61                     scroll.getVerticalScrollBar().getPreferredSize().width, 50);
62             scroll.revalidate();
63         });
64         robot.delay(200);
65         SwingUtilities.invokeAndWait(() ->
66                           scroll.getViewport().addChangeListener((e) -> cnt++));
67         robot.delay(1000);
68 
69         SwingUtilities.invokeLater(frame::dispose);
70 
71         if (cnt > 0) {
72             throw new RuntimeException("Scroll bar flickers");
73         }
74     }
75 }
76