8054543: Setting a border on a JLayer causes an Exceptions
authoralexp
Thu, 09 Oct 2014 20:51:39 +0400
changeset 27265 a6528e9ca83b
parent 27264 aa300ebffd04
child 27266 677e0bfc64d7
child 27270 c3983b6dbfbc
8054543: Setting a border on a JLayer causes an Exceptions Reviewed-by: serb, alexsch
jdk/src/java.desktop/share/classes/javax/swing/JLayer.java
jdk/test/javax/swing/JLayer/8054543/bug8054543.java
--- a/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java	Wed Oct 08 17:34:27 2014 +0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java	Thu Oct 09 20:51:39 2014 +0400
@@ -325,24 +325,38 @@
     }
 
     /**
-     * A non-{@code null} border, or non-zero insets, isn't supported, to prevent the geometry
-     * of this component from becoming complex enough to inhibit
-     * subclassing of {@code LayerUI} class.  To create a {@code JLayer} with a border,
-     * add it to a {@code JPanel} that has a border.
-     * <p>Note:  If {@code border} is non-{@code null}, this
-     * method will throw an exception as borders are not supported on
-     * a {@code JLayer}.
+     * Delegates its functionality to the {@code getView().setBorder(Border)} method,
+     * if the view component is an instance of {@code javax.swing.JComponent},
+     * otherwise this method is a no-op.
      *
-     * @param border the {@code Border} to set
-     * @exception IllegalArgumentException this method is not supported
+     * @param border the border to be rendered for the {@code view} component
+     * @see #getView()
+     * @see javax.swing.JComponent#setBorder(Border)
      */
     public void setBorder(Border border) {
-        if (border != null) {
-            throw new IllegalArgumentException("JLayer.setBorder() not supported");
+        if (view instanceof JComponent) {
+            ((JComponent)view).setBorder(border);
         }
     }
 
     /**
+     * Delegates its functionality to the {@code getView().getBorder()} method,
+     * if the view component is an instance of {@code javax.swing.JComponent},
+     * otherwise returns {@code null}.
+     *
+     * @return the border object for the {@code view} component
+     * @see #getView()
+     * @see #setBorder
+     * @see javax.swing.JComponent#getBorder()
+     */
+    public Border getBorder() {
+        if (view instanceof JComponent) {
+            return ((JComponent) view).getBorder();
+        }
+        return null;
+    }
+
+    /**
      * This method is not supported by {@code JLayer}
      * and always throws {@code UnsupportedOperationException}
      *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JLayer/8054543/bug8054543.java	Thu Oct 09 20:51:39 2014 +0400
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+ /*
+ * @test
+ * @summary Setting a border on a JLayer causes an Exceptions
+ * @author Alexander Potochkin
+ * @run main bug8054543
+ */
+
+import javax.swing.*;
+import javax.swing.border.Border;
+import java.awt.*;
+
+public class bug8054543 {
+
+    public bug8054543() {
+        JLayer<JComponent> layer = new JLayer<>();
+        Border border = BorderFactory.createLineBorder(Color.GREEN);
+        JButton view = new JButton("JButton");
+
+        layer.setBorder(border);
+        check(layer.getBorder(), null);
+
+        layer.setBorder(null);
+        check(layer.getBorder(), null);
+
+        layer.setView(view);
+        check(layer.getBorder(), view.getBorder());
+
+        layer.setBorder(border);
+        check(border, view.getBorder());
+
+        layer.setBorder(null);
+        check(layer.getBorder(), view.getBorder());
+    }
+
+    private void check(Object o1, Object o2) {
+        if (o1 != o2) {
+            throw new RuntimeException("Test failed");
+        }
+    }
+
+    public static void main(String... args) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                new bug8054543();
+            }
+        });
+    }
+}