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