8152159: LabelUI is not updated for TitledBorder
authoralexsch
Tue, 29 Mar 2016 09:38:19 -0700
changeset 36923 aa29023245f4
parent 36922 cf668c19e0de
child 36924 61453b6feccd
8152159: LabelUI is not updated for TitledBorder Reviewed-by: ssadetsky
jdk/src/java.desktop/share/classes/javax/swing/border/TitledBorder.java
jdk/test/javax/swing/border/8152159/TitledBorderLabelUITest.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<TitledBorder> weakReference = new WeakReference<TitledBorder>(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);
+    }
 }
--- /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