8057791: Selection in JList is drawn with wrong colors in Nimbus L&F
Reviewed-by: alexp, serb
--- 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);
+ }
+ }
+}