6937798: Nimbus: Issues with JTable grid
authoralexp
Tue, 25 May 2010 20:30:54 +0400
changeset 5588 57eca0aa621e
parent 5587 72871be64138
child 5589 5e4f59f34eea
6937798: Nimbus: Issues with JTable grid Reviewed-by: rupashka
jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java
jdk/test/javax/swing/JTable/6937798/bug6937798.java
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java	Tue May 25 20:22:44 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java	Tue May 25 20:30:54 2010 +0400
@@ -361,12 +361,14 @@
             cMax = table.getColumnCount()-1;
         }
 
-        // Paint the grid.
-        paintGrid(context, g, rMin, rMax, cMin, cMax);
-
         // Paint the cells.
         paintCells(context, g, rMin, rMax, cMin, cMax);
 
+        // Paint the grid.
+        // it is important to paint the grid after the cells, otherwise the grid will be overpainted
+        // because in Synth cell renderers are likely to be opaque
+        paintGrid(context, g, rMin, rMax, cMin, cMax);
+
         paintDropLines(context, g);
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTable/6937798/bug6937798.java	Tue May 25 20:30:54 2010 +0400
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6937798
+   @summary Nimbus: Issues with JTable grid
+   @author Alexander Potochkin
+   @run main bug6937798
+*/
+
+import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
+
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableModel;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class bug6937798 {
+
+    public static void main(String... args) throws Exception {
+        UIManager.setLookAndFeel(new NimbusLookAndFeel());
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                new bug6937798();
+            }
+        });
+    }
+
+    public bug6937798() {
+        final JTable table = createCountryTable();
+        table.setShowGrid(true);
+        table.setSize(100, 100);
+
+        BufferedImage im = new BufferedImage(table.getWidth(), table.getHeight(), BufferedImage.TYPE_INT_ARGB);
+        Graphics g = im.getGraphics();
+        table.print(g);
+        g.dispose();
+
+        for (int i = 0; i < im.getHeight(); i++) {
+            for (int j = 0; j < im.getWidth(); j++) {
+                if (im.getRGB(i, j) == table.getGridColor().getRGB()) {
+                    System.out.println("got it!");
+                    return;
+                }
+            }
+        }
+        throw new RuntimeException("no table's grid detected....");
+    }
+
+    protected JTable createCountryTable() {
+        // Column headers
+        final String
+                [] headers = {
+                "Name", "Capital City", "Language(s)", "Monetary Unit(s)", "EC Member"
+        };
+
+        // Table data
+        final Object[][] data = {
+                {"Albania", "Tirane", "Albanian, Greek", "Lek", new Boolean(false)},
+                {"Andorra", "Andorra la Vella", "Catalan, French, Spanish", "French Franc, Spanish Peseta", new Boolean(false)},
+                {"Austria", "Vienna", "German, Slovenian, Croatian", "Schilling", new Boolean(false)},
+                {"Belarus", "Minsk", "Byelorussian, Russian", "Belarusian Rubel", new Boolean(false)},
+                {"Belgium", "Brussels", "French, Flemish, German", "Belgian Franc", new Boolean(true)},
+                {"Bosnia & Herzegovina", "Sarajevo", "Serbo-Croatian", "Dinar", new Boolean(false)},
+                {"Bulgaria", "Sofia", "Bulgarian, Turkish", "Lev", new Boolean(false)},
+                {"Croatia", "Zagreb", "Serbo-Croatian", "Croatian Kuna", new Boolean(false)},
+                {"Czech Republic", "Prague", "Czech, Slovak", "Koruna", new Boolean(false)},
+                {"Denmark", "Copenhagen", "Danish", "Krone", new Boolean(true)},
+                {"Estonia", "Tallinn", "Estonian, Latvian, Lithuanian, Russian", "Estonian Kroon", new Boolean(false)},
+                {"Finland", "Helsinki", "Finnish, Swedish, Lappish", "Markka", new Boolean(false)},
+                {"France", "Paris", "French", "Franc", new Boolean(true)},
+                {"Germany", "Berlin", "German", "Deutsche Mark", new Boolean(true)},
+                {"Greece", "Athens", "Greek, English, French", "Drachma", new Boolean(true)},
+                {"Hungary", "Budapest", "Hungarian", "Forint", new Boolean(false)},
+                {"Iceland", "Reykjavik", "Icelandic", "Icelandic Krona", new Boolean(false)},
+                {"Ireland", "Dublin", "Irish, English", "Pound", new Boolean(true)},
+                {"Italy", "Rome", "Italian", "Lira", new Boolean(true)},
+                {"Latvia", "Riga", "Lettish, Lithuanian, Russian", "Lat", new Boolean(false)},
+                {"Liechtenstein", "Vaduz", "German", "Swiss Franc", new Boolean(false)},
+                {"Lithuania", "Vilnius", "Lithuanian, Polish, Russian", "Lita", new Boolean(false)},
+                {"Luxembourg", "Luxembourg", "French, German, Letzeburgesch", "Luxembourg Franc", new Boolean(true)},
+                {"Macedonia", "Skopje", "Macedonian, Albanian, Turkish, Serbo-Croatian", "Denar", new Boolean(false)},
+                {"Malta", "Valletta", "Maltese, English", "Maltese Lira", new Boolean(false)},
+                {"Moldova", "Chisinau", "Moldovan, Russian", "Leu", new Boolean(false)},
+                {"Monaco", "Monaco", "French, English, Italian", "French Franc", new Boolean(false)},
+                {"the Netherlands", "Amsterdam", "Dutch", "Guilder", new Boolean(true)},
+                {"Norway", "Oslo", "Norwegian", "Krone", new Boolean(false)},
+                {"Poland", "Warsaw", "Polish", "Zloty", new Boolean(false)},
+                {"Portugal", "Lisbon", "Portuguese", "Escudo", new Boolean(true)},
+                {"Romania", "Bucharest", "Romanian", "Leu", new Boolean(false)},
+                {"Russia", "Moscow", "Russian", "Ruble", new Boolean(false)},
+                {"San Marino", "San Marino", "Italian", "Italian Lira", new Boolean(false)},
+                {"Slovakia", "Bratislava", "Slovak, Hungarian", "Koruna", new Boolean(false)},
+                {"Slovenia", "Ljubljana", "Slovenian, Serbo-Croatian", "Tolar", new Boolean(false)},
+                {"Spain", "Madrid", "Spanish", "Peseta", new Boolean(true)},
+                {"Sweden", "Stockholm", "Swedish", "Krona", new Boolean(false)},
+                {"Switzerland", "Bern", "German, French, Italian", "Swiss Franc", new Boolean(false)},
+                {"Turkey", "Ankara", "Turkish", "Turkish Lira", new Boolean(false)},
+                {"Ukraine", "Kiev", "Ukranian, Russian, Romanian, Polish, Hungarian", "Hryvnia", new Boolean(false)},
+                {"United Kingdom", "London", "English, Welsh", "British Pound", new Boolean(true)},
+                {"Yugoslavia", "Belgrade", "Serbo-Croatian, Slovenian, Macedonian", "Dinar", new Boolean(false)},
+        };
+
+        // Table model
+        TableModel dataModel = new AbstractTableModel() {
+
+            public int getColumnCount() {
+                return headers.length;
+            }
+
+            public int getRowCount() {
+                return data.length;
+            }
+
+            public Object getValueAt(int row, int col) {
+                return data[row][col];
+            }
+
+            public String getColumnName(int column) {
+                return headers[column];
+            }
+
+            public Class getColumnClass(int col) {
+                return getValueAt(0, col).getClass();
+            }
+
+            public void setValueAt(Object aValue, int row, int column) {
+                data[row][column] = aValue;
+            }
+
+            public boolean isCellEditable(int row, int col) {
+                return (col == 4);
+            }
+        };
+
+        // Create table with table model
+        JTable countryTable = new JTable(dataModel);
+        countryTable.setGridColor(Color.pink);
+        countryTable.setBackground(Color.white);
+        countryTable.setForeground(Color.black);
+        return countryTable;
+    }
+}