# HG changeset patch # User rupashka # Date 1212501604 -14400 # Node ID af37dad9022da539d869224c393836022503780c # Parent be7d7a297c3d78e79bc31edfb89cf309bff5498d 4987336: JSlider doesn't show label's animated icon Summary: JSlider registers as an image observer of label's icon Reviewed-by: alexp diff -r be7d7a297c3d -r af37dad9022d src/share/classes/javax/swing/JSlider.java --- a/src/share/classes/javax/swing/JSlider.java Mon Jun 02 19:08:13 2008 +0400 +++ b/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. diff -r be7d7a297c3d -r af37dad9022d src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java --- a/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Mon Jun 02 19:08:13 2008 +0400 +++ b/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 ); diff -r be7d7a297c3d -r af37dad9022d test/javax/swing/JSlider/4987336/box.gif Binary file test/javax/swing/JSlider/4987336/box.gif has changed diff -r be7d7a297c3d -r af37dad9022d test/javax/swing/JSlider/4987336/bug4987336.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/JSlider/4987336/bug4987336.html Tue Jun 03 18:00:04 2008 +0400 @@ -0,0 +1,9 @@ + + + +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. + + diff -r be7d7a297c3d -r af37dad9022d test/javax/swing/JSlider/4987336/bug4987336.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/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 dictionary = new Hashtable(); + + 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()); + } + } + }); + } + } +} diff -r be7d7a297c3d -r af37dad9022d test/javax/swing/JSlider/4987336/cupanim.gif Binary file test/javax/swing/JSlider/4987336/cupanim.gif has changed