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 6567433
28  *
29  * @summary  JTableHeader.updateUI() invokes updateUI() on its TableCellrenderer via
30  * SwingUtilities.updateComponentTreeUI().
31  * If the Tablecellrenderer is a parent of this JTableHeader, the method recurses
32  * endless.
33  * This test tests that the fix is effective in avoiding recursion.
34  *
35  * @run main/othervm UpdateUIRecursionTest
36  */
37 
38 import java.awt.BorderLayout;
39 import java.awt.Component;
40 import javax.swing.JFrame;
41 import javax.swing.JLabel;
42 import javax.swing.JScrollPane;
43 import javax.swing.JTable;
44 import javax.swing.SwingUtilities;
45 import javax.swing.table.JTableHeader;
46 import javax.swing.table.TableCellRenderer;
47 
48 public class UpdateUIRecursionTest extends JFrame implements TableCellRenderer {
49     JTable table;
50 
UpdateUIRecursionTest()51     public UpdateUIRecursionTest() {
52         super("UpdateUIRecursionTest");
53         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
54         setSize(400, 400);
55 
56          String[] columnNames = {
57                 "First Name",
58                 "Last Name",
59                 "Sport",
60                 "# of Years",
61                 "Vegetarian"};
62 
63                 Object[][] data = {
64                     {"Mary", "Campione",
65                     "Snowboarding", new Integer(5), new Boolean(false)},
66                     {"Alison", "Huml",
67                     "Rowing", new Integer(3), new Boolean(true)},
68                     {"Kathy", "Walrath",
69                     "Knitting", new Integer(2), new Boolean(false)},
70                     {"Sharon", "Zakhour",
71                     "Speed reading", new Integer(20), new Boolean(true)},
72                     {"Philip", "Milne",
73                     "Pool", new Integer(10), new Boolean(false)}
74                 };
75 
76         JTableHeader tableHeader =  new JTableHeader();
77         table = new JTable(data, columnNames);
78         table.setTableHeader(tableHeader);
79         tableHeader.setDefaultRenderer(this);
80 
81         getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
82 
83         setVisible(true);
84     }
85 
main(String[] args)86     public static void main(String[] args) throws Exception {
87 
88         SwingUtilities.invokeAndWait(new Runnable() {
89 
90             @Override
91             public void run() {
92                 UpdateUIRecursionTest obj = new UpdateUIRecursionTest();
93 
94                 obj.test();
95 
96                 obj.disposeUI();
97             }
98         });
99     }
100 
test()101     public void test() {
102         SwingUtilities.updateComponentTreeUI(this);
103     }
104 
disposeUI()105     public void disposeUI() {
106         setVisible(false);
107         dispose();
108     }
109 
getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)110     public Component getTableCellRendererComponent(JTable table, Object value,
111         boolean isSelected, boolean hasFocus, int row, int col) {
112         return new JLabel(String.valueOf(value));
113     }
114 }
115 
116 
117