1/*
2 * Copyright (c) 2010, 2015, 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/* @test
25   @bug 6937798
26   @summary Nimbus: Issues with JTable grid
27   @author Alexander Potochkin
28   @modules java.desktop/com.sun.java.swing.plaf.nimbus
29   @run main bug6937798
30*/
31
32import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
33
34import javax.swing.*;
35import javax.swing.table.AbstractTableModel;
36import javax.swing.table.TableModel;
37import java.awt.*;
38import java.awt.image.BufferedImage;
39
40public class bug6937798 {
41
42    public static void main(String... args) throws Exception {
43        UIManager.setLookAndFeel(new NimbusLookAndFeel());
44        SwingUtilities.invokeAndWait(new Runnable() {
45            public void run() {
46                new bug6937798();
47            }
48        });
49    }
50
51    public bug6937798() {
52        final JTable table = createCountryTable();
53        table.setShowGrid(true);
54        table.setSize(100, 100);
55
56        BufferedImage im = new BufferedImage(table.getWidth(), table.getHeight(), BufferedImage.TYPE_INT_ARGB);
57        Graphics g = im.getGraphics();
58        table.print(g);
59        g.dispose();
60
61        for (int i = 0; i < im.getHeight(); i++) {
62            for (int j = 0; j < im.getWidth(); j++) {
63                if (im.getRGB(i, j) == table.getGridColor().getRGB()) {
64                    System.out.println("got it!");
65                    return;
66                }
67            }
68        }
69        throw new RuntimeException("no table's grid detected....");
70    }
71
72    protected JTable createCountryTable() {
73        // Column headers
74        final String
75                [] headers = {
76                "Name", "Capital City", "Language(s)", "Monetary Unit(s)", "EC Member"
77        };
78
79        // Table data
80        final Object[][] data = {
81                {"Albania", "Tirane", "Albanian, Greek", "Lek", new Boolean(false)},
82                {"Andorra", "Andorra la Vella", "Catalan, French, Spanish", "French Franc, Spanish Peseta", new Boolean(false)},
83                {"Austria", "Vienna", "German, Slovenian, Croatian", "Schilling", new Boolean(false)},
84                {"Belarus", "Minsk", "Byelorussian, Russian", "Belarusian Rubel", new Boolean(false)},
85                {"Belgium", "Brussels", "French, Flemish, German", "Belgian Franc", new Boolean(true)},
86                {"Bosnia & Herzegovina", "Sarajevo", "Serbo-Croatian", "Dinar", new Boolean(false)},
87                {"Bulgaria", "Sofia", "Bulgarian, Turkish", "Lev", new Boolean(false)},
88                {"Croatia", "Zagreb", "Serbo-Croatian", "Croatian Kuna", new Boolean(false)},
89                {"Czech Republic", "Prague", "Czech, Slovak", "Koruna", new Boolean(false)},
90                {"Denmark", "Copenhagen", "Danish", "Krone", new Boolean(true)},
91                {"Estonia", "Tallinn", "Estonian, Latvian, Lithuanian, Russian", "Estonian Kroon", new Boolean(false)},
92                {"Finland", "Helsinki", "Finnish, Swedish, Lappish", "Markka", new Boolean(false)},
93                {"France", "Paris", "French", "Franc", new Boolean(true)},
94                {"Germany", "Berlin", "German", "Deutsche Mark", new Boolean(true)},
95                {"Greece", "Athens", "Greek, English, French", "Drachma", new Boolean(true)},
96                {"Hungary", "Budapest", "Hungarian", "Forint", new Boolean(false)},
97                {"Iceland", "Reykjavik", "Icelandic", "Icelandic Krona", new Boolean(false)},
98                {"Ireland", "Dublin", "Irish, English", "Pound", new Boolean(true)},
99                {"Italy", "Rome", "Italian", "Lira", new Boolean(true)},
100                {"Latvia", "Riga", "Lettish, Lithuanian, Russian", "Lat", new Boolean(false)},
101                {"Liechtenstein", "Vaduz", "German", "Swiss Franc", new Boolean(false)},
102                {"Lithuania", "Vilnius", "Lithuanian, Polish, Russian", "Lita", new Boolean(false)},
103                {"Luxembourg", "Luxembourg", "French, German, Letzeburgesch", "Luxembourg Franc", new Boolean(true)},
104                {"Macedonia", "Skopje", "Macedonian, Albanian, Turkish, Serbo-Croatian", "Denar", new Boolean(false)},
105                {"Malta", "Valletta", "Maltese, English", "Maltese Lira", new Boolean(false)},
106                {"Moldova", "Chisinau", "Moldovan, Russian", "Leu", new Boolean(false)},
107                {"Monaco", "Monaco", "French, English, Italian", "French Franc", new Boolean(false)},
108                {"the Netherlands", "Amsterdam", "Dutch", "Guilder", new Boolean(true)},
109                {"Norway", "Oslo", "Norwegian", "Krone", new Boolean(false)},
110                {"Poland", "Warsaw", "Polish", "Zloty", new Boolean(false)},
111                {"Portugal", "Lisbon", "Portuguese", "Escudo", new Boolean(true)},
112                {"Romania", "Bucharest", "Romanian", "Leu", new Boolean(false)},
113                {"Russia", "Moscow", "Russian", "Ruble", new Boolean(false)},
114                {"San Marino", "San Marino", "Italian", "Italian Lira", new Boolean(false)},
115                {"Slovakia", "Bratislava", "Slovak, Hungarian", "Koruna", new Boolean(false)},
116                {"Slovenia", "Ljubljana", "Slovenian, Serbo-Croatian", "Tolar", new Boolean(false)},
117                {"Spain", "Madrid", "Spanish", "Peseta", new Boolean(true)},
118                {"Sweden", "Stockholm", "Swedish", "Krona", new Boolean(false)},
119                {"Switzerland", "Bern", "German, French, Italian", "Swiss Franc", new Boolean(false)},
120                {"Turkey", "Ankara", "Turkish", "Turkish Lira", new Boolean(false)},
121                {"Ukraine", "Kiev", "Ukranian, Russian, Romanian, Polish, Hungarian", "Hryvnia", new Boolean(false)},
122                {"United Kingdom", "London", "English, Welsh", "British Pound", new Boolean(true)},
123                {"Yugoslavia", "Belgrade", "Serbo-Croatian, Slovenian, Macedonian", "Dinar", new Boolean(false)},
124        };
125
126        // Table model
127        TableModel dataModel = new AbstractTableModel() {
128
129            public int getColumnCount() {
130                return headers.length;
131            }
132
133            public int getRowCount() {
134                return data.length;
135            }
136
137            public Object getValueAt(int row, int col) {
138                return data[row][col];
139            }
140
141            public String getColumnName(int column) {
142                return headers[column];
143            }
144
145            public Class getColumnClass(int col) {
146                return getValueAt(0, col).getClass();
147            }
148
149            public void setValueAt(Object aValue, int row, int column) {
150                data[row][column] = aValue;
151            }
152
153            public boolean isCellEditable(int row, int col) {
154                return (col == 4);
155            }
156        };
157
158        // Create table with table model
159        JTable countryTable = new JTable(dataModel);
160        countryTable.setGridColor(Color.pink);
161        countryTable.setBackground(Color.white);
162        countryTable.setForeground(Color.black);
163        return countryTable;
164    }
165}
166