8057791: Selection in JList is drawn with wrong colors in Nimbus L&F
authoralitvinov
Thu, 23 Jun 2016 12:53:56 +0300
changeset 39527 91a2d9219e81
parent 39526 3d0ccf1d8dc3
child 39528 0544281c5bd3
8057791: Selection in JList is drawn with wrong colors in Nimbus L&F Reviewed-by: alexp, serb
jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/skin.laf
jdk/test/javax/swing/plaf/nimbus/8057791/bug8057791.java
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/skin.laf	Wed Jun 22 16:10:36 2016 +0530
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/skin.laf	Thu Jun 23 12:53:56 2016 +0300
@@ -13407,7 +13407,7 @@
             <cacheSettingsInherited>false</cacheSettingsInherited>
             <cacheMode>NO_CACHING</cacheMode>
             <uiproperties>
-               <uiProperty name="rendererUseListColors" type="BOOLEAN" value="true"/>
+               <uiProperty name="rendererUseListColors" type="BOOLEAN" value="false"/>
                <uiProperty name="rendererUseUIBorder" type="BOOLEAN" value="true"/>
                <uiProperty name="cellNoFocusBorder" type="BORDER">
                    <border type="empty" top="2" left="5" bottom="2" right="5"/>
@@ -13513,10 +13513,10 @@
                   <uiproperties/>
                </style>
                <backgroundStates>
-                  <state stateKeys="Disabled">
+                  <state stateKeys="Selected">
                      <style>
                         <textForeground>
-                           <matte red="142" green="143" blue="145" alpha="255" uiDefaultParentName="nimbusDisabledText" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/>
+                           <matte red="255" green="255" blue="255" alpha="255" uiDefaultParentName="nimbusLightBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/>
                         </textForeground>
                         <textBackground/>
                         <background>
@@ -13541,6 +13541,56 @@
                         </layer>
                      </canvas>
                   </state>
+                  <state stateKeys="Disabled+Selected">
+                     <style>
+                        <textForeground/>
+                        <textBackground/>
+                        <background>
+                           <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/>
+                        </background>
+                        <inherit-background>false</inherit-background>
+                        <uiproperties/>
+                     </style>
+                     <canvas>
+                        <size width="100" height="30"/>
+                        <nextLayerNameIndex>2</nextLayerNameIndex>
+                        <stretchingInsets top="0" bottom="0" left="0" right="0"/>
+                        <layer name="Layer 1">
+                           <opacity>1.0</opacity>
+                           <fillOpacity>1.0</fillOpacity>
+                           <blendingMode>NORMAL</blendingMode>
+                           <locked>false</locked>
+                           <visible>true</visible>
+                           <shapes/>
+                           <effects/>
+                        </layer>
+                     </canvas>
+                  </state>
+                  <state stateKeys="Disabled">
+                     <style>
+                        <textForeground>
+                           <matte red="142" green="143" blue="145" alpha="255" uiDefaultParentName="nimbusDisabledText" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/>
+                        </textForeground>
+                        <textBackground/>
+                        <background/>
+                        <inherit-textForeground>false</inherit-textForeground>
+                        <uiproperties/>
+                     </style>
+                     <canvas>
+                        <size width="100" height="30"/>
+                        <nextLayerNameIndex>2</nextLayerNameIndex>
+                        <stretchingInsets top="0" bottom="0" left="0" right="0"/>
+                        <layer name="Layer 1">
+                           <opacity>1.0</opacity>
+                           <fillOpacity>1.0</fillOpacity>
+                           <blendingMode>NORMAL</blendingMode>
+                           <locked>false</locked>
+                           <visible>true</visible>
+                           <shapes/>
+                           <effects/>
+                        </layer>
+                     </canvas>
+                  </state>
                </backgroundStates>
                <foregroundStates/>
                <borderStates/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/nimbus/8057791/bug8057791.java	Thu Jun 23 12:53:56 2016 +0300
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 8057791
+   @summary Selection in JList is drawn with wrong colors in Nimbus L&F
+   @author Anton Litvinov
+   @run main bug8057791
+ */
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashSet;
+import javax.swing.DefaultListModel;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.plaf.nimbus.NimbusLookAndFeel;
+
+public class bug8057791 {
+    public static void main(String[] args) {
+        try {
+            UIManager.setLookAndFeel(new NimbusLookAndFeel());
+
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    final int listWidth = 50;
+                    final int listHeight = 50;
+                    final int selCellIndex = 0;
+
+                    JList<String> list = new JList<String>();
+                    list.setSize(listWidth, listHeight);
+                    DefaultListModel<String> listModel = new DefaultListModel<String>();
+                    listModel.add(selCellIndex, "E");
+                    list.setModel(listModel);
+                    list.setSelectedIndex(selCellIndex);
+
+                    BufferedImage img = new BufferedImage(listWidth, listHeight,
+                        BufferedImage.TYPE_INT_ARGB);
+                    Graphics g = img.getGraphics();
+                    list.paint(g);
+                    g.dispose();
+
+                    Rectangle cellRect = list.getCellBounds(selCellIndex, selCellIndex);
+                    HashSet<Color> cellColors = new HashSet<Color>();
+                    int uniqueColorIndex = 0;
+                    for (int x = cellRect.x; x < (cellRect.x + cellRect.width); x++) {
+                        for (int y = cellRect.y; y < (cellRect.y + cellRect.height); y++) {
+                            Color cellColor = new Color(img.getRGB(x, y), true);
+                            if (cellColors.add(cellColor)) {
+                                System.err.println(String.format("Cell color #%d: %s",
+                                    uniqueColorIndex++, cellColor));
+                            }
+                        }
+                    }
+
+                    Color selForegroundColor = list.getSelectionForeground();
+                    Color selBackgroundColor = list.getSelectionBackground();
+                    if (!cellColors.contains(new Color(selForegroundColor.getRGB(), true))) {
+                        throw new RuntimeException(String.format(
+                            "Selected cell is drawn without selection foreground color '%s'.",
+                            selForegroundColor));
+                    }
+                    if (!cellColors.contains(new Color(selBackgroundColor.getRGB(), true))) {
+                        throw new RuntimeException(String.format(
+                            "Selected cell is drawn without selection background color '%s'.",
+                            selBackgroundColor));
+                    }
+                }
+            });
+        } catch (UnsupportedLookAndFeelException | InterruptedException | InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}