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 或触控板上的滚动手势)移动。
这里有一些微妙之处。窗格的初始大小适合场景;当您四处滚动时,鼠标将位于窗格的边界之外。如果您在窗格边界外双击(因此您添加了一个参数在边界外的新节点),则窗格会在该点扩展以包含新的子项。
我正在尝试为我正在使用的编辑器实现导航功能,这将允许您通过在背景上拖动来在 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 或触控板上的滚动手势)移动。
这里有一些微妙之处。窗格的初始大小适合场景;当您四处滚动时,鼠标将位于窗格的边界之外。如果您在窗格边界外双击(因此您添加了一个参数在边界外的新节点),则窗格会在该点扩展以包含新的子项。