Debugging a UI refresh problem (not dirtyopts related it seems)
John Hendrikx
hjohn at xs4all.nl
Thu Jun 14 12:48:59 PDT 2012
I seem to have narrowed it down to the call to scrollTo()... when I
remove it, I cannot make it fail anymore.
So, the case is:
1) StackPane with two children, one of them being another StackPane that
contains a TableView or TreeView (happens with either) -- the Views
contain several pages worth of data.
A KeyEvent occurs, which triggers the following chain:
2a) Find the current selected item in said TableView/TreeView, and make
a note of it.
2b) Remove the StackPane with the View
2c) Add a new StackPane with a different View
2d) Reselect the item that was selected in the newly added View
(basically, the code switches between a TreeView and TableView)
Step 2d) does not do the selection (+scrolling) of the previously
selected item in the same Event (as that has proven in the past to cause
numerous issues...). As a work-around I found that it was better to
defer those calls by simply wrapping them in a Platform.runLater()...
So, after the KeyEvent fully completes, with maybe a few other events in
between, our Platform.runLater() code should run, which does the actual
selection (a focus() call) and the scrolling (a scrollTo() call).
If I comment out the scrollTo(), it works flawlessly and the new
StackPane is always redrawn correctly (but obviously, not in the correct
scroll position)
If I donot do the focus+scrollTo() in a Platform.runLater() then
basically that part of the code rarely functions properly at all (the
View classes simply donot seem to like it when you do these calls in the
same event that created them and made them part of the Scene, see my
comment in issue RT-18816)... despite that, the behaviour is slightly
different -- not the entire display disappears anymore, but only the
*View class is not drawn correctly (scrollbar visible, but nothing else).
So, it seems the problem is concentrated in the View classes, and
specifically how they deal with being created, filled, focused and
scroll'ed'To() in the same KeyEvent :)
--John
On 14/06/2012 20:38, John Hendrikx wrote:
> Hi Richard,
>
> The verbose options works, below is the output, dirtyopts seems to be
> false (3rd line).
>
> I've noticed that it is definitely related to whether or not any
> "animation" action occurs after switching a Child of the StackPane...
> if there is any kind of action happening (like an image being loaded,
> or a scrollTo command triggering a slight bit of scrolling) then it
> redraws properly... and it was hard to reproduce it because of that.
>
> However, I've now noticed that when I go back and forth between the
> same screens, and the 2nd time I return to the same view (when all
> Images are cached and the UI can react even faster) then the chance of
> the bug happening is much much bigger (like 90%). Apparently because
> no changes in layout or node values are occuring after the initial
> one... thus if the initial drawing was somehow missed, I end up with
> an empty screen until I do something that triggers a change. I'm not
> convinced that it might not be my fault somehow, but it doesn't occur
> in 2.1.
>
> So, it seems that under certain conditions, removing a child from a
> StackPane and replacing it with a similar child (which is practically
> static) results in it not being drawn. I'll see if I can strip it
> down far enough to make it reproducable in a stand-alone program in
> the weekend -- it is easy enough to reproduce in the main program (not
> like my scroll wheel bug :))
>
> --John
>
> 0.065 | Prism pipeline init order: d3d
> j2d
> -- com.sun.prism.impl.PrismSettings.checkSettings(PrismSettings.java:216)
> 0.066 | Using t2k for text
> rasterization
> -- com.sun.prism.impl.PrismSettings.checkSettings(PrismSettings.java:217)
> 0.066 | Not using dirty region
> optimizations
> -- com.sun.prism.impl.PrismSettings.checkSettings(PrismSettings.java:221)
> 0.066 | Prism pipeline name =
> com.sun.prism.d3d.D3DPipeline
> --
> com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:148)
> 0.067 | Loading D3D native library
> ...
> -- com.sun.prism.d3d.D3DPipeline$1.run(D3DPipeline.java:29)
> 0.069 |
> succeeded.
> -- com.sun.prism.d3d.D3DPipeline$1.run(D3DPipeline.java:33)
> 0.134 | Direct3D initialization
> succeeded
> -- com.sun.prism.d3d.D3DPipeline.<clinit>(D3DPipeline.java:40)
> 0.136 | (X) Got class = class
> com.sun.prism.d3d.D3DPipeline
> --
> com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:152)
> 0.137 | Initialized prism pipeline:
> com.sun.prism.d3d.D3DPipeline
> --
> com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:159)
> 0.185 | OS
> Information:
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:87)
> 0.185 | Windows 7 build
> 7601
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:88)
> 0.185 | D3D Driver
> Information:
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:89)
> 0.185 | NVIDIA GeForce GTX 550
> Ti
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:90)
> 0.185 |
> \\.\DISPLAY3
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:91)
> 0.186 | Driver nvd3dum.dll, version
> 8.17.12.8562
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:92)
> 0.186 | Pixel Shader version
> 3.0
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:93)
> 0.187 | Device : ven_10DE, dev_1244,
> subsys_83C21043
> --
> com.sun.prism.d3d.D3DPipeline.printDriverInformation(D3DPipeline.java:94)
> 0.220 | javafx.runtime.version:
> 2.2.0-beta-b11
> -- hs.mediasystem.FrontEnd.start(FrontEnd.java:75)
> 1.401 | -> RESIZE: 2187154536045615 w: 1440 h:
> 860
> --
> com.sun.javafx.tk.quantum.GlassViewEventHandler.handleViewEvent(GlassViewEventHandler.java:444)
> 1.411 | ProgramController.registerService() - registering new
> service:
> hs.mediasystem.screens.SubtitleDownloadService at 8e4e40
> --
> hs.mediasystem.screens.ProgramController.registerWorker(ProgramController.java:430)
> 1.413 | ProgramController.registerService() - registering new
> service: hs.mediasystem.screens.GroupWorker at 2e9f9e --
> hs.mediasystem.screens.ProgramController.registerWorker(ProgramController.java:430)
> 1.659 *| Database up to date at version
> 11
> --
> hs.mediasystem.db.DatabaseUpdater.updateDatabase(DatabaseUpdater.java:43)
> 1.663 *| Navigator.navigateTo() - Destination('Home';
> modal=false) --
> hs.mediasystem.screens.Navigator.navigateTo(Navigator.java:71)
> 1.702 | RESIZE: 2187154837492176 w: 1920 h: 1200
More information about the openjfx-dev
mailing list