4987336: JSlider doesn't show label's animated icon
Summary: JSlider registers as an image observer of label's icon
Reviewed-by: alexp
--- 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