RFR: 8274137: TableView scrollbar/header misaligned when reloading data

Robert Lichtenberger rlichten at openjdk.java.net
Fri Sep 24 06:20:54 UTC 2021


On Thu, 23 Sep 2021 16:46:15 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:

> First, this has the potential to hurt performance for applications that do a lot of setup on tables that aren't visible. 

That would be possible if the hbar changes its visibility or its value. I can't really see how that would happen as long as the hbar isn't visible. Well I guess it is theoretically possible that someone subclasses VirtualFlow and adds thousands of items and changes the hbar value to some value after each item before making the VirtualFlow visible.

> There are several places where we defer updating and the usual way we address any such problems is to validate when "something" changes. In this case, the "something" should include becoming visible or the scene going to non-null (or alternatively being "treeVisible", which means visible and part of a scene that is showing).

If this is the "convention" of how things should be done then I will adapt my PR to **not** remove the said line but instead make the listenerX fire also when the VIrtualFlow's visible or scene property changes. 
This will also fix the problem an keep the performance optimization in place.

> Second, the code you propose to remove was added as part of the fix for [JDK-8112072](https://bugs.openjdk.java.net/browse/JDK-8112072), and while I doubt it was added to ensure correctness, it will need to be tested.

As posted in JDK-8274137: Tested it, found no problems.

> Third, I prefer that tests not check a specific implementation detail such as ensuring that derived values are computed when the scene is null or the node is invisible. Rather, it is better to check that a change made while the node is not visible (or the scene is null), is valid _after_ making it visible on an active scene.
I claim that testScrollBarClipSyncWhileInvisibleOrNoScene does just that.
* It first checks that hBar and clipping stay in sync when the flow is visible and has a scene. (sunshine case)
* Then it changes the hBar while the flow is invisible, makes the flow visible again and checks if (after the flow is now visible again) hBar and clipping are in sync again.
* Then it does the same by removing hBar from the scene.

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

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


More information about the openjfx-dev mailing list