# HG changeset patch # User alexsch # Date 1459269499 25200 # Node ID aa29023245f4b352d881a8939bed8e5c690eac78 # Parent cf668c19e0debead64b990aa44ad6e253f42cc44 8152159: LabelUI is not updated for TitledBorder Reviewed-by: ssadetsky diff -r cf668c19e0de -r aa29023245f4 jdk/src/java.desktop/share/classes/javax/swing/border/TitledBorder.java --- a/jdk/src/java.desktop/share/classes/javax/swing/border/TitledBorder.java Tue Mar 29 14:43:05 2016 +0530 +++ b/jdk/src/java.desktop/share/classes/javax/swing/border/TitledBorder.java Tue Mar 29 09:38:19 2016 -0700 @@ -34,6 +34,9 @@ import java.awt.Rectangle; import java.awt.geom.Path2D; import java.beans.ConstructorProperties; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.lang.ref.WeakReference; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.UIManager; @@ -246,6 +249,7 @@ this.label = new JLabel(); this.label.setOpaque(false); this.label.putClientProperty(BasicHTML.propertyKey, null); + installPropertyChangeListeners(); } /** @@ -752,4 +756,25 @@ } return insets; } + + private void installPropertyChangeListeners() { + final WeakReference weakReference = new WeakReference(this); + final PropertyChangeListener listener = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (weakReference.get() == null) { + UIManager.removePropertyChangeListener(this); + UIManager.getDefaults().removePropertyChangeListener(this); + } else { + String prop = evt.getPropertyName(); + if ("lookAndFeel".equals(prop) || "LabelUI".equals(prop)) { + label.updateUI(); + } + } + } + }; + + UIManager.addPropertyChangeListener(listener); + UIManager.getDefaults().addPropertyChangeListener(listener); + } } diff -r cf668c19e0de -r aa29023245f4 jdk/test/javax/swing/border/8152159/TitledBorderLabelUITest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/border/8152159/TitledBorderLabelUITest.java Tue Mar 29 09:38:19 2016 -0700 @@ -0,0 +1,110 @@ +/* + * 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. + */ + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.SwingUtilities; +import javax.swing.UIDefaults; +import javax.swing.UIManager; +import javax.swing.border.TitledBorder; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.metal.MetalLabelUI; +import javax.swing.plaf.metal.MetalLookAndFeel; +import javax.swing.plaf.nimbus.NimbusLookAndFeel; + +/** + * @test + * @bug 8152159 + * @summary LabelUI is not updated for TitledBorder + * @run main/othervm TitledBorderLabelUITest LAF + * @run main/othervm TitledBorderLabelUITest LabelUI + */ + +public class TitledBorderLabelUITest { + + private static final int SIZE = 50; + private static boolean useLAF; + + public static void main(String[] args) throws Exception { + useLAF = "LAF".equals(args[0]); + SwingUtilities.invokeAndWait(TitledBorderLabelUITest::createAndShowGUI); + } + + private static void createAndShowGUI() { + + try { + UIManager.setLookAndFeel(new TestLookAndFeel()); + + JLabel label = new JLabel("Test Label"); + label.setSize(SIZE, SIZE); + TitledBorder border = new TitledBorder("ABCDEF"); + label.setBorder(new TitledBorder(border)); + + if (useLAF) { + UIManager.setLookAndFeel(new NimbusLookAndFeel()); + } else { + UIManager.getDefaults().put("LabelUI", MetalLabelUI.class.getName()); + } + + SwingUtilities.updateComponentTreeUI(label); + + paintToImage(label); + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void paintToImage(JComponent comp) { + BufferedImage image = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_INT_RGB); + Graphics2D g = image.createGraphics(); + comp.paint(g); + g.dispose(); + } + + public static class TestLookAndFeel extends MetalLookAndFeel { + + @Override + protected void initClassDefaults(UIDefaults table) { + super.initClassDefaults(table); + table.put("LabelUI", TestLabelUI.class.getName()); + } + } + + public static class TestLabelUI extends MetalLabelUI implements UIResource { + + public static ComponentUI createUI(JComponent c) { + return new TestLabelUI(); + } + + @Override + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + throw new RuntimeException("New LabelUI is not installed!"); + } + } +} \ No newline at end of file