On Thu, 28 Mar 2024 11:20:23 GMT, Marius Hanl <[email protected]> wrote:
>> This PR fixes the issue that after committing an edit on a >> ListView/TreeView/TableView/TreeTableView control, the control might lose >> the focus unexpectedly. >> >> For that, it refactors the >> `ControlUtils::requestFocusOnControlOnlyIfCurrentFocusOwnerIsChild` method, >> in order to check if the control (`ListView`, `TreeView`, `TableView`, >> `TreeTableView`) should request the focus _before_ the actual focus owner >> (which could be the control added to the cell to edit its content, like a >> `TextField`) is removed from the cell, so the `Control::requestFocus` call, >> if needed, can be still invoked after the edit commit is done (as it was >> done before). >> >> By adding >> `ControlUtils::controlShouldRequestFocusIfCurrentFocusOwnerIsChild` the >> `Cell::commitEdit` implementations can now query if the control should have >> the focus, after `super.commitEdit(newValue);` but before firing the >> `CellEditEvent` and calling `updateItem()`, and if the result is true, then >> request focus after the edit commit ends (like it was done before). >> >> Two new tests per control have been included, to verify that the focus >> remains at the control, one for edit cancel (this passes before and after >> the proposed changes), one for edit commit (this fails before and passes >> after including the proposed fix). > > modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeViewTest.java > line 2362: > >> 2360: assertTrue(treeView.isFocused()); >> 2361: >> 2362: VirtualFlowTestUtils.BLOCK_STAGE_LOADER_DISPOSE = true; > > This should not be needed since you are creating a `stageLoader` above. This > seems to be only used when no `stageLoader` was created before I wish there was a more reliable way of implementing getCell() without resorting to undocumented flags like BLOCK_STAGE_LOADER_DISPOSE. ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/1411#discussion_r1550266702
