--- old/test/javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java 2015-11-04 12:02:10.000000000 +0530 +++ new/test/javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java 2015-11-04 12:02:09.000000000 +0530 @@ -22,13 +22,13 @@ */ /* @test - @bug 8129940 - @summary JRadioButton does not honor non-standard FocusTraversalKeys - @author Semyon Sadetsky - */ - + @bug 8129940 8132770 + @summary JRadioButton should run custom FocusTraversalKeys for all LaFs + @run main FocusTraversal + */ import javax.swing.*; import java.awt.*; +import java.awt.Robot; import java.awt.event.KeyEvent; import java.util.HashSet; import java.util.Set; @@ -37,28 +37,50 @@ private static JFrame frame; private static JRadioButton a; + private static JRadioButton b; + private static JRadioButton c; private static JRadioButton d; private static JTextField next; private static JTextField prev; + private static Robot robot; public static void main(String[] args) throws Exception { + + robot = new Robot(); + robot.setAutoDelay(5); + robot.delay(2000); + UIManager.LookAndFeelInfo[] lookAndFeelArray + = UIManager.getInstalledLookAndFeels(); + for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) { + executeCase(lookAndFeelItem.getClassName()); + } + } + + private static void executeCase(String lookAndFeelString) throws Exception { + tryLookAndFeel(lookAndFeelString); + createUI(lookAndFeelString); + robot.delay(2000); + runTestCase(); + cleanUp(); + } + + private static void createUI(String lookAndFeelString) throws Exception { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { - frame = new JFrame("FocusTraversalTest"); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - frame.setUndecorated(true); - Set keystrokes = new HashSet(); keystrokes.add(KeyStroke.getKeyStroke("TAB")); keystrokes.add(KeyStroke.getKeyStroke("ENTER")); + frame = new JFrame("FocusTraversalTest " + lookAndFeelString); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frame.setUndecorated(true); frame.setFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, keystrokes); a = new JRadioButton("a"); - JRadioButton b = new JRadioButton("b"); - JRadioButton c = new JRadioButton("c"); + b = new JRadioButton("b"); + c = new JRadioButton("c"); d = new JRadioButton("d"); ButtonGroup radioButtonGroup = new ButtonGroup(); @@ -84,61 +106,98 @@ frame.add(root); frame.pack(); + frame.setLocationRelativeTo(null); frame.setVisible(true); + frame.toFront(); } }); + } - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - a.requestFocus(); - } - }); + private static void runTestCase() throws Exception { + LookAndFeel lookAndFeel = UIManager.getLookAndFeel(); + focusOn(a); + if (isExcludedLookAndFeel(lookAndFeel)) { + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + robot.waitForIdle(); + isFocusOwner(b, "forward"); + robot.keyPress(KeyEvent.VK_SHIFT); + robot.keyPress(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_SHIFT); + robot.waitForIdle(); + isFocusOwner(a, "backward"); + + } else { + + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + robot.waitForIdle(); + isFocusOwner(next, "forward"); + robot.keyPress(KeyEvent.VK_SHIFT); + robot.keyPress(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_SHIFT); + robot.waitForIdle(); + isFocusOwner(d, "backward"); + } - Robot robot = new Robot(); - robot.waitForIdle(); + } - robot.setAutoDelay(200); + private static boolean isExcludedLookAndFeel(LookAndFeel lookAndFeel) { - robot.keyPress(KeyEvent.VK_ENTER); - robot.keyRelease(KeyEvent.VK_ENTER); - robot.waitForIdle(); + return lookAndFeel.toString().toLowerCase().contains("aqua") + || lookAndFeel.toString().toLowerCase().contains("nimbus") + || lookAndFeel.toString().toLowerCase().contains("gtk"); + } + private static void focusOn(Component component) + throws Exception { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { - Component focusOwner = - FocusManager.getCurrentManager().getFocusOwner(); - if (focusOwner != next) { - throw new RuntimeException( - "Focus component is wrong after forward key " + focusOwner); - } + component.requestFocusInWindow(); } }); + } - robot.keyPress(KeyEvent.VK_SHIFT); - robot.keyPress(KeyEvent.VK_TAB); - robot.keyRelease(KeyEvent.VK_TAB); - robot.keyRelease(KeyEvent.VK_SHIFT); - robot.waitForIdle(); + private static void isFocusOwner(Component queriedFocusOwner, + String direction) + throws Exception { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { - Component focusOwner = - FocusManager.getCurrentManager().getFocusOwner(); - if (focusOwner != d) { + Component actualFocusOwner + = FocusManager.getCurrentManager().getFocusOwner(); + if (actualFocusOwner != queriedFocusOwner) { throw new RuntimeException( - "Focus component is wrong after backward key " + focusOwner); + "Focus component is wrong after " + direction + + " direction "); + } } }); - SwingUtilities.invokeLater(new Runnable() { + } + + private static void tryLookAndFeel(String lookAndFeelString) + throws Exception { + try { + UIManager.setLookAndFeel( + lookAndFeelString); + } catch (UnsupportedLookAndFeelException + | ClassNotFoundException + | InstantiationException + | IllegalAccessException e) { + } + + } + + private static void cleanUp() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { frame.dispose(); } }); - System.out.println("ok"); - } }