diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java b/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java index 8c58c916a4e..a4a2aaa5268 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java @@ -325,23 +325,37 @@ public final class JLayer } /** - * 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. - *

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} diff --git a/jdk/test/javax/swing/JLayer/8054543/bug8054543.java b/jdk/test/javax/swing/JLayer/8054543/bug8054543.java new file mode 100644 index 00000000000..28211b765f0 --- /dev/null +++ b/jdk/test/javax/swing/JLayer/8054543/bug8054543.java @@ -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 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(); + } + }); + } +}