|
1 | 1 | package io.fair_acc.chartfx.plugins; |
2 | 2 |
|
| 3 | +import java.util.HashMap; |
3 | 4 | import java.util.LinkedList; |
4 | 5 | import java.util.List; |
| 6 | +import java.util.Map; |
5 | 7 |
|
6 | 8 | import javafx.beans.property.BooleanProperty; |
7 | 9 | import javafx.beans.property.ObjectProperty; |
8 | 10 | import javafx.beans.property.SimpleBooleanProperty; |
9 | 11 | import javafx.beans.property.SimpleObjectProperty; |
| 12 | +import javafx.beans.value.ChangeListener; |
10 | 13 | import javafx.collections.FXCollections; |
11 | 14 | import javafx.collections.ObservableList; |
12 | 15 | import javafx.event.EventHandler; |
13 | 16 | import javafx.event.EventType; |
14 | 17 | import javafx.geometry.Point2D; |
15 | 18 | import javafx.scene.Node; |
| 19 | +import javafx.scene.Scene; |
16 | 20 | import javafx.scene.canvas.Canvas; |
17 | 21 | import javafx.scene.input.InputEvent; |
18 | 22 | import javafx.scene.input.MouseEvent; |
@@ -45,6 +49,7 @@ public abstract class ChartPlugin implements Measurable.EmptyDefault { |
45 | 49 | private static final Logger LOGGER = LoggerFactory.getLogger(ChartPlugin.class); |
46 | 50 | private final ObservableList<Node> chartChildren = FXCollections.observableArrayList(); |
47 | 51 | private final List<Pair<EventType<? extends InputEvent>, EventHandler<? extends InputEvent>>> mouseEventHandlers = new LinkedList<>(); |
| 52 | + private final Map<Node, ChangeListener<? super Scene>> sceneChangeListeners = new HashMap<>(); |
48 | 53 |
|
49 | 54 | /** |
50 | 55 | * The associated {@link Chart}. Initialised when the plug-in is added to the Chart, set to {@code null} when |
@@ -90,19 +95,29 @@ private <T extends InputEvent> void addEventHandlers(final Node node) { |
90 | 95 | final EventType<T> type = (EventType<T>) pair.getKey(); |
91 | 96 | final EventHandler<T> handler = (EventHandler<T>) pair.getValue(); |
92 | 97 | node.addEventHandler(type, handler); |
93 | | - node.sceneProperty().addListener((ch, o, n) -> { |
94 | | - if (o == n) { |
95 | | - return; |
96 | | - } |
97 | | - if (o != null) { |
| 98 | + } |
| 99 | + ChangeListener<? super Scene> sceneListener = (ch, o, n) -> { |
| 100 | + if (o == n) { |
| 101 | + return; |
| 102 | + } |
| 103 | + if (o != null) { |
| 104 | + for (final Pair<EventType<? extends InputEvent>, EventHandler<? extends InputEvent>> pair : mouseEventHandlers) { |
| 105 | + final EventType<T> type = (EventType<T>) pair.getKey(); |
| 106 | + final EventHandler<T> handler = (EventHandler<T>) pair.getValue(); |
98 | 107 | o.removeEventHandler(type, handler); |
99 | 108 | } |
| 109 | + } |
100 | 110 |
|
101 | | - if (n != null) { |
| 111 | + if (n != null) { |
| 112 | + for (final Pair<EventType<? extends InputEvent>, EventHandler<? extends InputEvent>> pair : mouseEventHandlers) { |
| 113 | + final EventType<T> type = (EventType<T>) pair.getKey(); |
| 114 | + final EventHandler<T> handler = (EventHandler<T>) pair.getValue(); |
102 | 115 | n.addEventHandler(type, handler); |
103 | 116 | } |
104 | | - }); |
105 | | - } |
| 117 | + } |
| 118 | + }; |
| 119 | + sceneChangeListeners.put(node, sceneListener); |
| 120 | + node.sceneProperty().addListener(sceneListener); |
106 | 121 | } |
107 | 122 |
|
108 | 123 | /** |
@@ -230,9 +245,11 @@ private <T extends InputEvent> void removeEventHandlers(final Node node) { |
230 | 245 | final EventHandler<T> handler = (EventHandler<T>) pair.getValue(); |
231 | 246 | node.removeEventHandler(type, handler); |
232 | 247 | if (node.getScene() != null) { |
233 | | - node.getScene().removeEventFilter(type, handler); |
| 248 | + node.getScene().removeEventHandler(type, handler); |
234 | 249 | } |
235 | 250 | } |
| 251 | + node.sceneProperty().removeListener(sceneChangeListeners.get(node)); |
| 252 | + sceneChangeListeners.put(node, null); |
236 | 253 | } |
237 | 254 |
|
238 | 255 | /** |
|
0 commit comments