diff --git a/test/jdk/javax/swing/JComponent/bug4765272.java b/test/jdk/javax/swing/JComponent/bug4765272.java new file mode 100644 index 00000000000..d88d5f328ed --- /dev/null +++ b/test/jdk/javax/swing/JComponent/bug4765272.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2004, 2023, 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 + * @bug 4765272 + * @summary REGRESSION: IAE: focusCycleRoot not focus cyle root of a Component + * @key headful + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.FlowLayout; +import java.awt.FocusTraversalPolicy; +import java.awt.Robot; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class bug4765272 { + static boolean focusGained = false; + static JFrame f; + static JButton bt1; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(() -> { + f = new JFrame("bug4765272"); + bt1 = new JButton("Button 1"); + JButton bt2 = new JButton("Button 2"); + + JPanel p = new JPanel(); + p.setLayout(new FlowLayout()); + p.add(bt1); + p.add(bt2); + f.getContentPane().add(p); + + FocusTraversalPolicy policy = new FocusTraversalPolicy() { + @Override + public Component getComponentAfter(Container aContainer, Component aComponent) { + if (aComponent == bt1) { + return bt2; + } + return bt1; + } + + @Override + public Component getComponentBefore(Container aContainer, Component aComponent) { + if (aComponent == bt1) { + return bt2; + } + return bt1; + } + + @Override + public Component getFirstComponent(Container aContainer) { + return bt1; + } + + @Override + public Component getLastComponent(Container aContainer) { + return bt2; + } + + @Override + public Component getDefaultComponent(Container aContainer) { + return bt1; + } + }; + + bt1.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent e) { + p.removeAll(); + synchronized (this) { + focusGained = true; + this.notifyAll(); + } + } + }); + + f.setLocationRelativeTo(null); + f.setVisible(true); + }); + + Robot r = new Robot(); + r.waitForIdle(); + r.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + bt1.requestFocus(); + try { + if (!focusGained) { + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + } + } +} diff --git a/test/jdk/javax/swing/JComponent/bug4979794.java b/test/jdk/javax/swing/JComponent/bug4979794.java new file mode 100644 index 00000000000..e8203045e57 --- /dev/null +++ b/test/jdk/javax/swing/JComponent/bug4979794.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004, 2023, 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 + * @bug 4979794 + * @summary A component is sometimes the next component for itself in focus policy. + * @key headful + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.FocusTraversalPolicy; +import java.awt.Robot; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class bug4979794 { + static JFrame fr; + static JButton btn1; + static JButton btn2; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(() -> { + fr = new JFrame("bug4979794"); + fr.getContentPane().setLayout(null); + + JPanel p = new JPanel(); + p.setLayout(null); + fr.getContentPane().add(p); + + btn1 = new JButton("Button 1"); + btn1.setBounds(0, 0, 200, 200); + + btn2 = new JButton("Button 2"); + btn2.setBounds(0, 0, 200, 200); + + p.add(btn1); + p.add(btn2); + p.setSize(200, 200); + + fr.setLocationRelativeTo(null); + fr.setSize(300, 300); + fr.setVisible(true); + }); + + Robot r = new Robot(); + r.waitForIdle(); + r.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + Container root = btn1.getFocusCycleRootAncestor(); + FocusTraversalPolicy policy = root.getFocusTraversalPolicy(); + Component next1 = policy.getComponentAfter(fr, btn1); + Component next2 = policy.getComponentAfter(fr, btn2); + if (next1 == next2) { + throw new RuntimeException("btn1 and btn2 have the same next Component."); + } + }); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (fr != null) { + fr.dispose(); + } + }); + } + } +} diff --git a/test/jdk/javax/swing/JPanel/bug4907772.java b/test/jdk/javax/swing/JPanel/bug4907772.java new file mode 100644 index 00000000000..56c784b7653 --- /dev/null +++ b/test/jdk/javax/swing/JPanel/bug4907772.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2003, 2023, 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 + * @bug 4907772 + * @summary 1.4 REGRESSION: JPanel responds to mouse clicks on overlapping JPanel + * @key headful + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.FocusTraversalPolicy; +import java.awt.Robot; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class bug4907772 { + static JFrame fr; + static JButton btn1; + static JButton btn2; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(() -> { + fr = new JFrame("bug4907772"); + fr.getContentPane().setLayout(null); + + JPanel p = new JPanel(); + p.setLayout(null); + fr.getContentPane().add(p); + + btn1 = new JButton("Button 1"); + btn1.setBounds(0, 0, 200, 200); + + btn2 = new JButton("Button 2"); + btn2.setBounds(0, 0, 200, 200); + + p.add(btn1); + p.add(btn2); + + fr.setLocationRelativeTo(null); + fr.pack(); + fr.setVisible(true); + }); + + Robot r = new Robot(); + r.waitForIdle(); + r.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + Container root = btn1.getFocusCycleRootAncestor(); + FocusTraversalPolicy policy = root.getFocusTraversalPolicy(); + Component initial = policy.getInitialComponent(fr); + if (initial == btn2) { + throw new RuntimeException("The underlying button shouldn't be the initial component of FCR"); + } + }); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (fr != null) { + fr.dispose(); + } + }); + } + } +} diff --git a/test/jdk/javax/swing/RootPaneChecking/RootPaneChecking.java b/test/jdk/javax/swing/RootPaneChecking/RootPaneChecking.java new file mode 100644 index 00000000000..52946b714e2 --- /dev/null +++ b/test/jdk/javax/swing/RootPaneChecking/RootPaneChecking.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2002, 2023, 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 + * @bug 4753342 + * @key headful + * @summary Makes sure add/remove/setLayout redirect to the contentpane + */ + +import java.awt.Container; +import java.awt.GridLayout; +import java.awt.LayoutManager; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JWindow; +import javax.swing.RootPaneContainer; +import javax.swing.SwingUtilities; + +public class RootPaneChecking { + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + MyJFrame frame = new MyJFrame(); + frame.setTitle("RootPaneChecking"); + checkRootPaneCheckingEnabled(frame); + frame.setRootPaneCheckingEnabled(false); + checkRootPaneCheckingDisabled(frame); + + MyJWindow window = new MyJWindow(); + checkRootPaneCheckingEnabled(window); + window.setRootPaneCheckingEnabled(false); + checkRootPaneCheckingDisabled(window); + + MyJDialog dialog = new MyJDialog(); + checkRootPaneCheckingEnabled(dialog); + dialog.setRootPaneCheckingEnabled(false); + checkRootPaneCheckingDisabled(dialog); + + MyJInternalFrame iframe = new MyJInternalFrame(); + checkRootPaneCheckingEnabled(iframe); + iframe.setRootPaneCheckingEnabled(false); + checkRootPaneCheckingDisabled(iframe); + }); + } + + private static void checkRootPaneCheckingEnabled(RootPaneContainer rpc) { + Container parent = (Container) rpc; + Container cp = rpc.getContentPane(); + // Test add + JButton button = new JButton("RootPaneChecking"); + parent.add(button); + if (button.getParent() != cp) { + throw new RuntimeException("Add parent mismatch, want: " + + cp + " got " + button.getParent()); + } + + // Test remove + parent.remove(button); + if (button.getParent() != null) { + throw new RuntimeException("Remove mismatch, want null got " + + button.getParent()); + } + + // Test setLayout + LayoutManager manager = new GridLayout(); + parent.setLayout(manager); + if (manager != cp.getLayout()) { + throw new RuntimeException("LayoutManager mismatch, want: " + + manager + " got " + cp.getLayout()); + } + } + + private static void checkRootPaneCheckingDisabled(RootPaneContainer rpc) { + Container parent = (Container) rpc; + Container cp = rpc.getContentPane(); + + // Test add + JButton button = new JButton("RootPaneChecking"); + parent.add(button); + if (button.getParent() != parent) { + throw new RuntimeException("Add parent mismatch, want: " + + parent + " got " + button.getParent()); + } + + // Test setLayout + LayoutManager manager = new GridLayout(); + parent.setLayout(manager); + if (manager != parent.getLayout()) { + throw new RuntimeException("LayoutManager mismatch, want: " + + manager + " got " + cp.getLayout()); + } + } + + static class MyJFrame extends JFrame { + public void setRootPaneCheckingEnabled(boolean x) { + super.setRootPaneCheckingEnabled(x); + } + } + + static class MyJWindow extends JWindow { + public void setRootPaneCheckingEnabled(boolean x) { + super.setRootPaneCheckingEnabled(x); + } + } + + static class MyJDialog extends JDialog { + public void setRootPaneCheckingEnabled(boolean x) { + super.setRootPaneCheckingEnabled(x); + } + } + + static class MyJInternalFrame extends JInternalFrame { + public void setRootPaneCheckingEnabled(boolean x) { + super.setRootPaneCheckingEnabled(x); + } + } +}