The method `ControlAcceleratorSupport.doAcceleratorInstall(final List<? extends 
MenuItem> items, final Scene scene)` adds a `ChangeListener` on 
`MenuItem.acceleratorProperty()`. This listener is not removed when the 
MenuItem is removed from scenegraph.
Adding and removing a MenuItem results in multiple copies of the listener added 
to MenuItem.acceleratorProperty().

Fix is to remove the listener when MenuItem is removed.
Fix can be verified by checking the number of instances of 
`ControlAcceleratorSupport.lambda` using _jvisualvm_. 
Without this fix, the number of `ControlAcceleratorSupport.lambda` increase in 
multiple of number of MenuItems being removed and added back.
With fix, the count is always same as number of MenuItems in scenegraph.

Also there is another ListChangeListener added to a `ObservableList<MenuItem> 
items` in the method `ControlAcceleratorSupport.doAcceleratorInstall(final 
ObservableList<MenuItem> items, final Scene scene)`. There was a TODO note to 
remove this listener.
This listener is added on `MenuBarButton.getItems()` and not on 
`Menu.getItems()`.  This `MenuBarButton` is created by `MenuBarSkin` to show a 
`Menu`. This `MenuBarButton` gets disposed when the related `Menu` is removed 
from scenegraph, and so the added `ListChangeListener` gets GCed. Hence it is 
not required to explicitly remove the listener. 
Added a comment explaining this behavior in place of the TODO.

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

Commit messages:
 - remove listener added to MenuItem from ControlAcceleratorSupport

Changes: https://git.openjdk.java.net/jfx/pull/429/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jfx&pr=429&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8208088
  Stats: 46 lines in 1 file changed: 34 ins; 10 del; 2 mod
  Patch: https://git.openjdk.java.net/jfx/pull/429.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/429/head:pull/429

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

Reply via email to