[Rev 01] RFR: 8242489: ChoiceBox: initially toggle not sync'ed to selection
Ambarish Rapte
arapte at openjdk.java.net
Wed Apr 15 16:09:24 UTC 2020
On Wed, 15 Apr 2020 10:02:47 GMT, Jeanette Winzenburg <fastegal at openjdk.org> wrote:
>> Macroscopic issue is that initially, the toggle is not sync'ed to the selection state. Root reason is an missing else
>> block when updating toggle selection state (see report for details).
>> Fixed by introducing the else block and removing all follow-up errors that tried to amend the consequences of the
>> incorrect selection state
>> - removed listener to selected item
>> - removed toggle selection update in showing listener
>>
>> The former also fixed the memory leak when replacing the selectionModel plus an unreported NPE when the selectionModel
>> is null initially.
>> Added tests that failed before the fix and passed after. As there had been no tests around toggle state, so added some
>> to verify that the change doesn't break. Enhanced shim/skin to allow access to popup for testing. Removed the
>> informally ignored test part for memory leak.
>
> Jeanette Winzenburg has updated the pull request incrementally with one additional commit since the last revision:
>
> ChoiceBox: added FIXME with reference to issue
The change looks good to me, however I have minor concern about selecting Separator, which should be taken in a follow
on issue. It may need a change in `Separator` selection test here.
modules/javafx.controls/src/main/java/javafx/scene/control/skin/ChoiceBoxSkin.java line 416:
> 415: } else {
> 416: toggleGroup.selectToggle(null);
> 417: }
The `else` part here means that user programmatically has selected a `Separator` or `SeparatorMenuItem`. The behavior
in such scenario is not defined in doc but the methods, `select()`, `selectNext()`, `selectPrevious()` of
`ChoiceBox.ChoiceBoxSelectionModel` imply that if index points to a `Separator` then a valid item should be selected.
However these method do handle this correctly. If these methods are implemented such that no Separator is allowed to
be selected then this `else` part would not be needed and we might be able to remove the `instanceof` checks.
The fix in this PR looks good to me.
But we should also decide the behavior in above scenario and may be file a JBS.
If we decide that when a `Separator` is chosen for selection then the current selection should not be changed or a
valid item should be selected, then the test related to Separator selection need to be changed. Or all of it can be
handled in a follow on issue.
modules/javafx.controls/src/main/java/javafx/scene/control/skin/ChoiceBoxSkin.java line 347:
> 346: // Test only purpose
> 347: ContextMenu getChoiceBoxPopup() {
> 348: return popup;
I would recommend to prefix the method name with `test_.` It is not followed across, only `TabPaneSkin` has `test_`
prefixed method.
-------------
PR: https://git.openjdk.java.net/jfx/pull/177
More information about the openjfx-dev
mailing list