4987336: JSlider doesn't show label's animated icon
authorrupashka
Tue, 03 Jun 2008 18:00:04 +0400
changeset 677 20718977427b
parent 676 8cf833d60e87
child 678 7d331a53a753
4987336: JSlider doesn't show label's animated icon Summary: JSlider registers as an image observer of label's icon Reviewed-by: alexp
jdk/src/share/classes/javax/swing/JSlider.java
jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java
jdk/test/javax/swing/JSlider/4987336/box.gif
jdk/test/javax/swing/JSlider/4987336/bug4987336.html
jdk/test/javax/swing/JSlider/4987336/bug4987336.java
jdk/test/javax/swing/JSlider/4987336/cupanim.gif
--- a/jdk/src/share/classes/javax/swing/JSlider.java	Mon Jun 02 19:08:13 2008 +0400
+++ b/jdk/src/share/classes/javax/swing/JSlider.java	Tue Jun 03 18:00:04 2008 +0400
@@ -33,8 +33,7 @@
 import java.io.ObjectOutputStream;
 import java.io.IOException;
 
-import java.awt.Color;
-import java.awt.Font;
+import java.awt.*;
 import java.util.*;
 import java.beans.*;
 
@@ -761,6 +760,33 @@
         updateLabelSizes();
     }
 
+    /**
+     * {@inheritDoc}
+     * @since 1.7
+     */
+    public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
+        if (!isShowing()) {
+            return false;
+        }
+
+        // Check that there is a label with such image
+        Enumeration elements = labelTable.elements();
+
+        while (elements.hasMoreElements()) {
+            Component component = (Component) elements.nextElement();
+
+            if (component instanceof JLabel) {
+                JLabel label = (JLabel) component;
+
+                if (SwingUtilities.doesIconReferenceImage(label.getIcon(), img) ||
+                        SwingUtilities.doesIconReferenceImage(label.getDisabledIcon(), img)) {
+                    return super.imageUpdate(img, infoflags, x, y, w, h);
+                }
+            }
+        }
+
+        return false;
+    }
 
     /**
      * Returns the dictionary of what labels to draw at which values.
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Mon Jun 02 19:08:13 2008 +0400
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Tue Jun 03 18:00:04 2008 +0400
@@ -25,16 +25,8 @@
 
 package javax.swing.plaf.basic;
 
-import java.awt.Component;
 import java.awt.event.*;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Dimension;
-import java.awt.Rectangle;
-import java.awt.Insets;
-import java.awt.Color;
-import java.awt.IllegalComponentStateException;
-import java.awt.Polygon;
+import java.awt.*;
 import java.beans.*;
 import java.util.Dictionary;
 import java.util.Enumeration;
@@ -1101,6 +1093,16 @@
                     JComponent label = (JComponent) dictionary.get(key);
                     label.setEnabled(enabled);
 
+                    if (label instanceof JLabel) {
+                        Icon icon = label.isEnabled() ? ((JLabel) label).getIcon() : ((JLabel) label).getDisabledIcon();
+
+                        if (icon instanceof ImageIcon) {
+                            // Register Slider as an image observer. It allows to catch notifications about
+                            // image changes (e.g. gif animation)
+                            Toolkit.getDefaultToolkit().checkImage(((ImageIcon) icon).getImage(), -1, -1, slider);
+                        }
+                    }
+
                     if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
                         g.translate( 0, labelBounds.y );
                         paintHorizontalLabel( g, value, label );
Binary file jdk/test/javax/swing/JSlider/4987336/box.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSlider/4987336/bug4987336.html	Tue Jun 03 18:00:04 2008 +0400
@@ -0,0 +1,9 @@
+<html>
+<body>
+<applet  code="bug4987336.class" width=600 height=400></applet>
+There are four Sliders. Each of them has a label with animated gif (a cup of coffee)
+and a label with static image.
+
+Check that for every LAF animation works for all Sliders. 
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSlider/4987336/bug4987336.java	Tue Jun 03 18:00:04 2008 +0400
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2007 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 4987336
+   @summary JSlider doesn't show label's animated icon.
+   @author Pavel Porvatov
+   @run applet/manual=done bug4987336.html
+*/
+
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Hashtable;
+
+public class bug4987336 extends JApplet {
+    private static final String IMAGE_RES = "box.gif";
+
+    private static final String ANIM_IMAGE_RES = "cupanim.gif";
+
+    public void init() {
+        JPanel pnLafs = new JPanel();
+        pnLafs.setLayout(new BoxLayout(pnLafs, BoxLayout.Y_AXIS));
+
+        ButtonGroup group = new ButtonGroup();
+
+        pnLafs.setBorder(new TitledBorder("Available Lafs"));
+
+        for (UIManager.LookAndFeelInfo lafInfo : UIManager.getInstalledLookAndFeels()) {
+            LafRadioButton comp = new LafRadioButton(lafInfo);
+
+            pnLafs.add(comp);
+            group.add(comp);
+        }
+
+        JPanel pnContent = new JPanel();
+
+        pnContent.setLayout(new BoxLayout(pnContent, BoxLayout.Y_AXIS));
+
+        pnContent.add(pnLafs);
+        pnContent.add(createSlider(true, IMAGE_RES, IMAGE_RES, ANIM_IMAGE_RES, ANIM_IMAGE_RES));
+        pnContent.add(createSlider(false, IMAGE_RES, IMAGE_RES, ANIM_IMAGE_RES, ANIM_IMAGE_RES));
+        pnContent.add(createSlider(true, ANIM_IMAGE_RES, null, IMAGE_RES, IMAGE_RES));
+        pnContent.add(createSlider(false, ANIM_IMAGE_RES, null, IMAGE_RES, IMAGE_RES));
+
+        getContentPane().add(new JScrollPane(pnContent));
+    }
+
+    private static JSlider createSlider(boolean enabled,
+                                        String firstEnabledImage, String firstDisabledImage,
+                                        String secondEnabledImage, String secondDisabledImage) {
+        Hashtable<Integer, JComponent> dictionary = new Hashtable<Integer, JComponent>();
+
+        dictionary.put(0, createLabel(firstEnabledImage, firstDisabledImage));
+        dictionary.put(1, createLabel(secondEnabledImage, secondDisabledImage));
+
+        JSlider result = new JSlider(0, 1);
+
+        result.setLabelTable(dictionary);
+        result.setPaintLabels(true);
+        result.setEnabled(enabled);
+
+        return result;
+    }
+
+    private static JLabel createLabel(String enabledImage, String disabledImage) {
+        ImageIcon enabledIcon = enabledImage == null ? null :
+                new ImageIcon(bug4987336.class.getResource(enabledImage));
+
+        ImageIcon disabledIcon = disabledImage == null ? null :
+                new ImageIcon(bug4987336.class.getResource(disabledImage));
+
+        JLabel result = new JLabel(enabledImage == null && disabledImage == null ? "No image" : "Image",
+                enabledIcon, SwingConstants.LEFT);
+
+        result.setDisabledIcon(disabledIcon);
+
+        return result;
+    }
+
+    private class LafRadioButton extends JRadioButton {
+        public LafRadioButton(final UIManager.LookAndFeelInfo lafInfo) {
+            super(lafInfo.getName(), lafInfo.getName().equals(UIManager.getLookAndFeel().getName()));
+
+            addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent e) {
+                    try {
+                        UIManager.setLookAndFeel(lafInfo.getClassName());
+
+                        SwingUtilities.updateComponentTreeUI(bug4987336.this);
+                    } catch (Exception ex) {
+                        // Ignore such errors
+                        System.out.println("Cannot set LAF " + lafInfo.getName());
+                    }
+                }
+            });
+        }
+    }
+}
Binary file jdk/test/javax/swing/JSlider/4987336/cupanim.gif has changed