changeset 9969:6e5619283b00

8226892: ActionListeners on JRadioButtons don't get notified when selection is changed with arrow keys Reviewed-by: mbalao
author andrew
date Mon, 20 Jul 2020 18:02:41 +0100
parents 3e83fb280e30
children 98d40e72833e
files src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java test/javax/swing/JRadioButton/8033699/bug8033699.java
diffstat 2 files changed, 64 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	Sun Mar 20 07:35:20 2016 +0000
+++ b/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	Mon Jul 20 18:02:41 2020 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2019, 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
@@ -531,8 +531,13 @@
                 }
                 if (newSelectedBtn != null &&
                     (newSelectedBtn != activeBtn)) {
+                    ButtonModel btnModel = newSelectedBtn.getModel();
+                    btnModel.setPressed(true);
+                    btnModel.setArmed(true);
                     newSelectedBtn.requestFocusInWindow();
                     newSelectedBtn.setSelected(true);
+                    btnModel.setPressed(false);
+                    btnModel.setArmed(false);
                 }
             }
         }
--- a/test/javax/swing/JRadioButton/8033699/bug8033699.java	Sun Mar 20 07:35:20 2016 +0000
+++ b/test/javax/swing/JRadioButton/8033699/bug8033699.java	Mon Jul 20 18:02:41 2020 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2019, 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
@@ -25,7 +25,7 @@
  * @test
  * @library ../../regtesthelpers
  * @build Util
- * @bug 8033699
+ * @bug 8033699 8226892
  * @summary  Incorrect radio button behavior when pressing tab key
  * @author Vivi An
  * @run main bug8033699
@@ -86,6 +86,9 @@
 
         // down key circle back to first button in grouped radio button
         runTest8();
+
+        // Verify that ActionListener is called when a RadioButton is selected using arrow key.
+        runTest9();
     }
 
     private static void createAndShowGUI() {
@@ -239,6 +242,59 @@
         });
     }
 
+    private static Boolean actRB1 = false;
+    private static Boolean actRB2 = false;
+    private static Boolean actRB3 = false;
+
+    // JDK-8226892: Verify that ActionListener is called when a RadioButton is selected using arrow key.
+    private static void runTest9() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+              radioBtn1.setSelected(true);
+              radioBtn1.requestFocusInWindow();
+            }
+        });
+
+        ActionListener actLrRB1 = new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+              actRB1 = true;
+            }
+        };
+        ActionListener actLrRB2 = new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+              actRB2 = true;
+            }
+        };
+        ActionListener actLrRB3 = new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+              actRB3 = true;
+            }
+        };
+
+        radioBtn1.addActionListener(actLrRB1);
+        radioBtn2.addActionListener(actLrRB2);
+        radioBtn3.addActionListener(actLrRB3);
+
+        hitKey(robot, KeyEvent.VK_DOWN);
+        hitKey(robot, KeyEvent.VK_DOWN);
+        hitKey(robot, KeyEvent.VK_DOWN);
+
+        String failMessage = "ActionListener not invoked when selected using arrow key.";
+        if (!actRB2) {
+            throw new RuntimeException("RadioButton 2: " + failMessage);
+        }
+        if (!actRB3) {
+            throw new RuntimeException("RadioButton 3: " + failMessage);
+        }
+        if (!actRB1) {
+            throw new RuntimeException("RadioButton 1: " + failMessage);
+        }
+
+        radioBtn1.removeActionListener(actLrRB1);
+        radioBtn2.removeActionListener(actLrRB2);
+        radioBtn3.removeActionListener(actLrRB3);
+    }
+
     private static void hitKey(Robot robot, int keycode) {
         robot.keyPress(keycode);
         robot.keyRelease(keycode);