1 /*
2  * Copyright (c) 2013, 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 import java.awt.*;
24 import javax.swing.*;
25 import java.awt.event.*;
26 
27 /**
28  * @test
29  * @bug 7161568
30  * @author Alexander Scherbatiy
31  * @summary Tests that navigating tabs in the JTAbbedPane does not throw NPE
32  * @run main bug7161568
33  */
34 public class bug7161568 {
35 
36     private static final int N = 50;
37     private static JTabbedPane tabbedPane;
38 
main(String[] args)39     public static void main(String[] args) throws Exception {
40         UIManager.put("TabbedPane.selectionFollowsFocus", Boolean.FALSE);
41 
42         Robot robot = new Robot();
43         robot.setAutoDelay(50);
44 
45         SwingUtilities.invokeAndWait(new Runnable() {
46 
47             @Override
48             public void run() {
49                 createAndShowUI();
50             }
51         });
52 
53         robot.waitForIdle();
54 
55         SwingUtilities.invokeAndWait(new Runnable() {
56 
57             @Override
58             public void run() {
59                 tabbedPane.requestFocus();
60             }
61         });
62 
63         robot.waitForIdle();
64 
65         for (int i = 0; i < N; i++) {
66             robot.keyPress(KeyEvent.VK_LEFT);
67             robot.keyRelease(KeyEvent.VK_LEFT);
68             robot.waitForIdle();
69         }
70     }
71 
createAndShowUI()72     static void createAndShowUI() {
73         JFrame frame = new JFrame("Test");
74         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
75         frame.setSize(100, 100);
76 
77         tabbedPane = new JTabbedPane();
78 
79         for (int i = 0; i < N; i++) {
80             tabbedPane.addTab("Tab: " + i, new JLabel("Test"));
81         }
82 
83         tabbedPane.setSelectedIndex(0);
84 
85         frame.getContentPane().add(tabbedPane);
86         frame.setVisible(true);
87     }
88 }
89