diff --git a/test/jdk/java/awt/Focus/8000326/SetFocusTraversalKeysEnabledTest.java b/test/jdk/java/awt/Focus/8000326/SetFocusTraversalKeysEnabledTest.java new file mode 100644 index 00000000000..ee033f1c44d --- /dev/null +++ b/test/jdk/java/awt/Focus/8000326/SetFocusTraversalKeysEnabledTest.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2013, 2022, 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 8000326 + * @key headful + * @summary Focus unable to traverse within the menubar + * @run main SetFocusTraversalKeysEnabledTest + */ +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.ContainerOrderFocusTraversalPolicy; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.lang.reflect.InvocationTargetException; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class SetFocusTraversalKeysEnabledTest { + + private static volatile JFrame jFrame; + private static volatile Component currentFocusOwner; + + private static void doTest() + throws InvocationTargetException, InterruptedException, AWTException { + try { + SwingUtilities.invokeAndWait(() -> createGUI()); + Robot robot = new Robot(); + robot.setAutoDelay(500); + Component lastFocusOwner = null; + do { + robot.waitForIdle(); + SwingUtilities.invokeAndWait(() -> currentFocusOwner = jFrame.getFocusOwner()); + + System.out.println("Focus owner is : " + currentFocusOwner.getClass().getName()); + if (currentFocusOwner == lastFocusOwner) { + throw new RuntimeException( + "Problem moving focus from " + currentFocusOwner.getClass().getName()); + } + lastFocusOwner = currentFocusOwner; + robot.keyPress(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_TAB); + } while (currentFocusOwner != jFrame); + } finally { + SwingUtilities.invokeAndWait(() -> jFrame.dispose()); + } + } + + private static void createGUI() { + jFrame = new JFrame("Focus Traversal Test"); + jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + + JMenuBar jMenuBar = new JMenuBar(); + jMenuBar.setFocusTraversalKeysEnabled(true); + jMenuBar.add(new JMenu("First Menu").add(new JMenuItem("First MenuItem"))); + + JButton northButton = new JButton("North Button"); + JButton southButton = new JButton("South Button"); + + JPanel jPanel = new JPanel(new BorderLayout()); + jPanel.add(northButton); + jPanel.add(jMenuBar, BorderLayout.NORTH); + jPanel.add(southButton, BorderLayout.SOUTH); + + jFrame.getContentPane().add(jPanel); + jFrame.setFocusTraversalPolicy(new ContainerOrderFocusTraversalPolicy()); + jFrame.pack(); + northButton.requestFocusInWindow(); + jFrame.setLocationRelativeTo(null); + jFrame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + doTest(); + } +} +