RFR: 8237602: TabPane doesn't respect order of TabPane.getTabs() list

Kevin Rushforth kcr at openjdk.java.net
Fri May 1 14:50:53 UTC 2020


On Wed, 29 Apr 2020 04:40:59 GMT, Ambarish Rapte <arapte at openjdk.org> wrote:

> Issue:
> When tabs are permuted as mentioned in the issue description as,
> 1. TabPane.getTabs().setAll(tab0, tab1)
> 2. TabPane.getTabs().setAll(tab0, tab1, tab2, tab3);
> the tab headers do not get permuted in same order as `TabPane.getTabs()`.
> 
> => tab headers should be shown in order as  tab0, tab1, tab2, tab3.
> => but are show in order as  tab2, tab3, tab0, tab1
> 
> Cause:
> Newly added tabs(tab2, tab3) are not inserted at correct index. The index `Change.getFrom()` (0) used from Change does
> not remain valid after the tabs to be moved(tab0, tab1) are removed from `tabsToAdd` list.
> Fix:
> Use the index of first newly added tab, from `TabPane.getTabs()`, which would be always reliable.
> 
> Verification:
> No existing tests fail due to this change.
> Added a system test which fails without and pass with fix.

I think the change is fine, although I still need to run it. I have a couple questions / comments.

modules/javafx.controls/src/main/java/javafx/scene/control/skin/TabPaneSkin.java line 649:

> 648:                 if (!tabsToAdd.isEmpty()) {
> 649:                     addTabs(tabsToAdd, getSkinnable().getTabs().indexOf(tabsToAdd.get(0)));
> 650:                 }

@kleopatra is right in that there is no guarantee that the set of added sublists from multiple Changes are contiguous.
Since this assumption is preexisting, I agree that this is just something to keep in mind.

modules/javafx.controls/src/main/java/javafx/scene/control/skin/TabPaneSkin.java line 994:

> 993:         private void moveTab(int moveToIndex, TabHeaderSkin tabHeaderSkin) {
> 994:             if (moveToIndex != headersRegion.getChildren().indexOf(tabHeaderSkin)) {
> 995:                 headersRegion.getChildren().remove(tabHeaderSkin);

Unless I am missing something, this check seems unrelated to the bug.

tests/system/src/test/java/test/robot/javafx/scene/TabPanePermuteGetTabsTest.java line 194:

> 193:     @Test
> 194:     public void testPermutGetTabsWithMoreTabs1() {
> 195:         // Step #1

Typo: Permut --> Permute

(or, as long as you are changing it anyway, you could rename it now to something other than "permute" since it isn't).

tests/system/src/test/java/test/robot/javafx/scene/TabPanePermuteGetTabsTest.java line 224:

> 223:         });
> 224:         delay();
> 225:

Does using Robot to select the Tab test add value? Probably not worth worrying about given that this will all move to
the controls unit tests with [JDK-8244195](https://bugs.openjdk.java.net/browse/JDK-8244195).

-------------

PR: https://git.openjdk.java.net/jfx/pull/201


More information about the openjfx-dev mailing list