package bluej.pkgmgr;

import java.util.ArrayList;
import java.util.List;
import javafx.beans.binding.DoubleExpression;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.geometry.Point2D;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;

import bluej.utility.javafx.JavaFXUtil;
import threadchecker.OnThread;
import threadchecker.Tag;


| An overlay pane which can display nodes at arbitrary positions, | with some additional support for tracking the current mouse position. | | It should be added to the front of a StackPane in front of whatever | you want the overlays to appear in front of. | @OnThread(Tag.FXPlatform) public class MouseTrackingOverlayPane extends Pane{ private final DoubleProperty mouseX = new SimpleDoubleProperty(0.0); private final DoubleProperty mouseY = new SimpleDoubleProperty(0.0); private final BooleanProperty mouseInsideProperty = new SimpleBooleanProperty(false); private final List<MousePositionListener> listeners = new ArrayList<>(); public MouseTrackingOverlayPane() { setMouseTransparent(true); JavaFXUtil.onceNotNull(parentProperty(), parent -> { parent.addEventFilter(MouseEvent.MOUSE_MOVED, e -> { Point2D p = MouseTrackingOverlayPane.this.sceneToLocal(e.getSceneX(), e.getSceneY()); mouseX.set(p.getX()); mouseY.set(p.getY()); for (MousePositionListener l : listeners) l.mouseMoved(e.getSceneX(), e.getSceneY()); }); parent.addEventFilter(MouseEvent.MOUSE_ENTERED, e -> mouseInsideProperty.set(true)); parent.addEventFilter(MouseEvent.MOUSE_EXITED, e -> mouseInsideProperty.set(false)); }); }
| Adds a node to this pane. The node's position will be set to be the current mouse | position plus the given offsets. | | If showWhenMouseLeft is true, the node will be shown at the last mouse position when | the mouse was inside the (parent's; see constructor) node. If it's false, it will | be hidden once the mouse exits. | public void addMouseTrackingOverlay(Node info, boolean showWhenMouseLeft, DoubleExpression xOffset, DoubleExpression yOffset) { getChildren().add(info); info.layoutXProperty().bind(mouseX.add(xOffset)); info.layoutYProperty().bind(mouseY.add(yOffset)); if (!showWhenMouseLeft) info.visibleProperty().bind(mouseInsideProperty); } public void addMouseListener(MousePositionListener mouseListener) { listeners.add(mouseListener); }
| Removes the node from the pane. | public void remove(Node node) { getChildren().remove(node); } public void removeMouseListener(MousePositionListener mousePositionListener) { listeners.add(mousePositionListener); } @OnThread(Tag.FXPlatform) @FunctionalInterface public static interface MousePositionListener { public void mouseMoved(double sceneX, double sceneY); } }
top, use, map, class MouseTrackingOverlayPane

.   MouseTrackingOverlayPane
.   addMouseTrackingOverlay
.   addMouseListener
.   remove
.   removeMouseListener

top, use, map, interface MouseTrackingOverlayPane . MousePositionListener

.   mouseMoved




100 neLoCode + 10 LoComm