Will do. I also just noticed (after using Bindings.select(this.sceneProperty(), "window", "showing") to try to trigger my "diconnecting") that in 7u40 TreeCells seem to remain connected to the scene until I force the tree to repaint. In my app every time I open a document I rebuild a tree. even when listening to the above mentioned binding, nothing was triggering as I loaded new documents until I resized my UI. Then suddenly all those unused TreeCells were "let go".
Scott On Tue, Oct 8, 2013 at 3:48 PM, Jonathan Giles <jonathan.gi...@oracle.com>wrote: > I note right at the end you say you're using 7u40. In the JavaFX 2.x > series of releases it is true that TreeView misbehaved a bit around cell > reuse. This should no longer be the case in JavaFX 8.0. In any case, the > best option is to file a bug report and discuss it further in there, > especially so if you can reproduce the issue in JavaFX 8.0. > > One thing that sticks out: you don't say if you're using > WeakEventHandler or EventHandler instances. If you're using EventHandler > you could consider using WeakEventHandler. This may help to alleviate > some of the memory leak. > > -- Jonathan > > On 9/10/2013 8:37 a.m., Scott Palmer wrote: > > I'm investigating a memory leak and it seems that the culprit is event > > listeners attached to TreeCells > > > > The GC roots of my leaks are deep in the JavaFX window/event system > > > > In a class extending TreeCell, am calling methods on such as: > > > > setOnContextMenuRequested(contextMenuRequestHandler); > > setOnMouseClicked(mouseEventHandler); > > setOnDragDetected(dragDetectedHandler); > > > > All of the event handlers in this case will have a reference to the > > TreeCell, either via the implicit reference of the anonymous inner class, > > or an explicit member > > > > I do this in updateItem when the cell is not empty and has a non-null > item. > > If updateItem is called and the cell is empty or has a null item then I > > clear the event handlers with: > > > > setOnContextMenuRequested(null); > > setOnMouseClicked(null); > > setOnDragDetected(null); > > > > The problem is that TreeView doesn't seem to reuse TreeCells very much. > It > > mostly creates new ones. This means that many TreeCells are disconnected > > from the scene graph and "lost" while there is still an event handler > > connected to it. > > > > Am I doing something wrong? > > This seemed like the correct way to deal with dragging and double > clicking > > on tree nodes. > > > > The tutorial here: > > http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm#BABDEADA > > > > only goes so far as to add a context menu. (My context menu needs to be > > constructed dynamically.) So I'm not sure if I'm "allowed" to connect > > event handlers to TreeCells in this way, but I don't know what the > > alternative is. > > > > I suppose I would have to listen to something to ensure the TreeCell is > > still part of the scene graph and disconnect the listeners when that > > changes. It seems a bit awkward. > > > > > > Scott > > (I'm using 7u40) > >