RFR: 8277922: Unable to click JCheckBox in JTable through Java Access Bridge
Sergey Bylokhov
serb at openjdk.java.net
Mon Feb 21 22:52:46 UTC 2022
On Sat, 12 Feb 2022 00:52:34 GMT, Anton Litvinov <alitvinov at openjdk.org> wrote:
>> src/java.desktop/share/classes/javax/swing/JTable.java line 5508:
>>
>>> 5506: (table != null) && table.isEnabled() &&
>>> 5507: table.isCellEditable(row, column)) {
>>> 5508: table.setValueAt(Boolean.valueOf(newSelectedState),
>>
>> Where this code is triggered if the user click on the checkbox by the mouse?
>
> Mouse click on JCheckBox is handled differently from execution of "click" accessible action on this JCheckBox, because behind mouse click different AWT mouse events stand which are processed properly, while "doAccessibleAction()" does not involve these mouse events and all their code. So if you are worrying about focus or selection as a result of "doAccessibleAction()", then I checked the behavior of "doAccessibleAction" on JCheckBox, JButton located outside JTable and I confirm that it does not lead to setting of focus to these components, hence there is no need to set focus to this "JCheckBox" "BooleanRenderer" when it is in table cell and no need to change selection in JTable.
>
> I suppose that this code should be invoked only by calling "doAccessibleAction(int)" on object of "AccessibleAction" interface either through Java Accessibility API like it is in this regression test or through Java Access Bridge API from the native assistive software application like it is in the manual test attached to the bug and in that case it is called from the method "private boolean doAccessibleActions(final AccessibleContext ac, final String name)" in the file "src/jdk.accessibility/windows/classes/com/sun/java/accessibility/internal/AccessBridge.java".
> The reason of the issue is the fact that when the assistive technology software tries to do "AccessibleAction" on "AccessibleContext" associated with a cell with boolean data type in "JTable" component through Java Access Bridge (JAB), the JDK executes this "AccessibleAction" on "AccessibleContext" of a renderer, which is an instance of the class "javax.swing.JTable.BooleanRenderer" which is a derivative of "JCheckBox" class, and the instance of this renderer is single and common for all cells of boolean data type. Therefore execution of "click" "AccessibleAction" on this renderer component which is not permanently bound to any particular cell in the table does not lead to update of the table cell value.
But how do the real mouse clicks trigger selection/deselection of the checkbox state, I guess that the "table.setValueAt()" should be called somewhere, can we do something similar from the "doAccessibleAction()"?
-------------
PR: https://git.openjdk.java.net/jdk/pull/7416
More information about the client-libs-dev
mailing list