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