JavaFX 可拖动背景 - 替代使用相机?

JavaFX draggable background - alternative to using a camera?

我正在尝试为我正在使用的编辑器实现导航功能,这将允许您通过在背景上拖动来在 window 中四处移动 - 基本上就像您可以在 Open Maps 中四处移动一样.

我目前的方法是通过场景中的 DragEvent-Listeners 移动场景摄像机,其中显示的对象是根组的子对象。

但是,我想知道是否有另一种不需要使用相机的方法来实现这一点。

以下是一个简单的测试:

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class InfinitePanning extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane drawingPane = new Pane();
        drawingPane.setStyle("-fx-background-color: white;");
        Scene scene = new Scene(drawingPane, 800, 800, Color.WHITE);

        scene.setOnScroll(e -> {
            drawingPane.setTranslateX(drawingPane.getTranslateX() + e.getDeltaX());
            drawingPane.setTranslateY(drawingPane.getTranslateY() + e.getDeltaY());
        });
        scene.setOnMouseClicked(e -> {
            if (e.getClickCount() == 2) {
                Point2D center = drawingPane.sceneToLocal(new Point2D(e.getX(), e.getY()));
                Circle c = new Circle(center.getX(), center.getY(), 25, Color.CORNFLOWERBLUE);
                drawingPane.getChildren().add(c);
            }
        });
        Circle c = new Circle(50, 50, 25, Color.CORNFLOWERBLUE);
        drawingPane.getChildren().add(c);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

双击添加一个新圆圈,用鼠标滚动(滚动 button/wheel 或触控板上的滚动手势)移动。

这里有一些微妙之处。窗格的初始大小适合场景;当您四处滚动时,鼠标将位于窗格的边界之外。如果您在窗格边界外双击(因此您添加了一个参数在边界外的新节点),则窗格会在该点扩展以包含新的子项。