8054543: Setting a border on a JLayer causes an Exceptions
Reviewed-by: serb, alexsch
--- 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();
+ }
+ });
+ }
+}