From 371694d67b2fb1dc47508570159ca1ec08910474 Mon Sep 17 00:00:00 2001 From: arapte Date: Wed, 30 Oct 2019 16:59:40 +0530 Subject: [PATCH] 8226892: ActionListeners on JRadioButtons don't get notified when selection is changed with arrow keys Reviewed-by: serb, psadhukhan --- .../swing/plaf/basic/BasicRadioButtonUI.java | 7 ++- .../JRadioButton/8033699/bug8033699.java | 46 ++++++++++++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java b/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java index 9c73734b7..420e30e93 100644 --- a/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java +++ b/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java @@ -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 @@ public class BasicRadioButtonUI extends BasicToggleButtonUI } 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); } } } diff --git a/test/javax/swing/JRadioButton/8033699/bug8033699.java b/test/javax/swing/JRadioButton/8033699/bug8033699.java index 63409dead..15b9c6526 100644 --- a/test/javax/swing/JRadioButton/8033699/bug8033699.java +++ b/test/javax/swing/JRadioButton/8033699/bug8033699.java @@ -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 @@ public class bug8033699 { // 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,45 @@ public class bug8033699 { }); } + 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(() -> { + radioBtn1.setSelected(true); + radioBtn1.requestFocusInWindow(); + }); + + ActionListener actLrRB1 = e -> actRB1 = true; + ActionListener actLrRB2 = e -> actRB2 = true; + ActionListener actLrRB3 = 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); -- GitLab