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