-
Bug
-
Resolution: Fixed
-
P3
-
7u80, 8u40, 9
-
b140
-
x86_64
-
windows_7
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8268519 | 8u311 | Alexey Ivanov | P3 | Resolved | Fixed | b01 |
JDK-8271423 | 7u331 | Alexey Ivanov | P3 | Resolved | Fixed | b01 |
JDK1.8.0_66
ADDITIONAL OS VERSION INFORMATION :
Window 7
A DESCRIPTION OF THE PROBLEM :
In one of the last JDK 1.8 versions the tabbing behaviour for radio button groups was changed.
See e.g. https://bugs.openjdk.java.net/browse/JDK-8033699
Now, under circumstances, some focusable fields are not reachable anymore.
For example:
<Radio Button 1> <Radio Button 2> <Textarea 1>
<Radio Button 3> <Radio Button 4> <Textarea 2>
<Radio Button 7> <Radio Button 6> <Textarea 3>
The focus will always jump to "Textarea 3" if the user uses "tabs" at RadioButton1, RB3, RB7 or RB6.
Textarea 1 and Textarea 2 are only reachable, if the user uses the cursor-keys to select RB2 or RB4 and presses thereafter the tab-key.
The expected behaviour in current Java version for this example is: (some RB auf RB-Group) -> Textarea 1 -> Textarea 2 -> Testarea 3 -> back to start...
The old expected behaviour before 1.8_40 was: RB1 -> RB2 -> Textarea 1 --> RB3 -> ...
Currently the behaviour is nonpractical. The user could not tab to "Textarea 1" or "Textarea 2" in an easily comprehensible manner.
Perhaps a property to switch to the old behaviour would be a workaround, because the new behaviour is not always the best idea...
REGRESSION. Last worked in version 8u72
ADDITIONAL REGRESSION INFORMATION:
I suppose the bug results from a change in 1.8_4x
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
See source code example
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The new expected behaviour for the example is: (some RB auf RB-Group) -> Textarea 1 -> Textarea 2 -> Testarea 3 -> back to start...
ACTUAL -
"Option 1" pressing Tab --> cursor Jumps to Textfield 2
"Option 2" pressing Tab --> cursor Jumps to Textfield 1
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class FocusCycleRootTest
{
public static void main(String[] args)
{
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel rootPanel = new JPanel();
rootPanel.setLayout(new BorderLayout());
JPanel formPanel = new JPanel(new GridLayout(3, 3));
formPanel.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
formPanel.setFocusCycleRoot(true);
JRadioButton option1 = new JRadioButton("Option 1", true);
JRadioButton option2 = new JRadioButton("Option 2");
JRadioButton option3 = new JRadioButton("Option 3");
JRadioButton option4 = new JRadioButton("Option 4");
ButtonGroup radioButtonGroup = new ButtonGroup();
radioButtonGroup.add(option1);
radioButtonGroup.add(option2);
radioButtonGroup.add(option3);
radioButtonGroup.add(option4);
formPanel.add(option1);
formPanel.add(option2);
formPanel.add(new JTextField("1 - focusable, but not reachable"));
formPanel.add(option3);
formPanel.add(option4);
formPanel.add(new JTextField("2 - focusable, great!"));
formPanel.add(new JTextField("3 - another focusable textfield"));
rootPanel.add(formPanel, BorderLayout.CENTER);
JButton okButton = new JButton("OK");
rootPanel.add(okButton, BorderLayout.SOUTH);
window.add(rootPanel);
window.pack();
window.setVisible(true);
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
I spent some time on debugging the java swing code and discovered the following cause:
In SortingFocusTraversalPolicy the focus cycle is calculated.
See getFocusTraversalCycle(aContainer) --> enumerateAndSortCycle()
In this order the RadioButton entries are separately arranged.
Later in BasicRadioButtonUI.class the method "containsInGroup" checks, whether the component belongs to a buttongroup. In this case the element behind the last buttongroup element will be taken. --> That is why the focus jumps from the first element to the element behind the last element of the radiobutton-group. But this is not correct, if there are other components between the radio button group elements, that do not belong to the radio-button group.
Solution:
The button group should be considered while sorting the focus-cycle. The containsInGroup check in BasicRadioButtonUI::getFocusTransferBaseComponent is to late to fix the focus behaviour.
- backported by
-
JDK-8268519 Fields not reachable anymore by tab-key, because of new tabbing behaviour of radio button groups.
- Resolved
-
JDK-8271423 Fields not reachable anymore by tab-key, because of new tabbing behaviour of radio button groups.
- Resolved
- duplicates
-
JDK-8156175 Tabbing sequence is broken for Radio buttons
- Closed
- relates to
-
JDK-8033699 Incorrect radio button behavior
- Resolved
-
JDK-8268518 Add headful keyword to LayoutFocusTraversalPolicy.java
- Resolved
-
JDK-8167284 [TESTBUG] [PIT] possible regression: javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java
- Resolved
-
JDK-8158282 [macosx] radio buttons have incorrect focus behavior
- Closed
-
JDK-8158283 Wrong radio button gets focus when radio button group gets focus
- Closed
-
JDK-8182577 Exception when Tab key moves focus to a JCheckbox with a custom ButtonModel
- Resolved
- links to
-
Review(master) openjdk/jdk8u-dev/285