JavaFX 可拖动背景 - 替代使用相机?
Posted
技术标签:
【中文标题】JavaFX 可拖动背景 - 替代使用相机?【英文标题】:JavaFX draggable background - alternative to using a camera? 【发布时间】:2018-04-04 02:15:36 【问题描述】:我正在尝试为我正在使用的编辑器实现导航功能,这将允许您通过拖动背景在窗口中移动 - 基本上就像您可以在 Open Maps 中移动一样。
我目前的方法是通过场景中的 DragEvent-Listeners 移动场景相机,其中显示的对象是根组的子对象。
但是,我想知道是否有另一种不需要使用相机的实现方式。
【问题讨论】:
根据具体的用例,您也许可以使用可平移的ScrollPane
(只需将滚动条策略设置为NEVER
)。
非常感谢,pannable 似乎正是我为了有效搜索而缺少的词。但是,这种方法会引入窗格大小固定的问题,而使用组作为根节点让我不必担心任何对象是否仍在窗格范围内,而用户可能会四处移动它。不过,我猜这是一个新问题。
不太确定我是否理解。您可以使用Group
作为滚动窗格的内容。如果内容的大小未知(或无限),则滚动窗格将不起作用(这就是为什么我说它取决于确切的用例)。
是的,这就是我的意思。据我所知,使用 Group 作为场景中的根节点似乎使 JavaFX 在一个几乎无限的平面上渲染了 group 的所有子节点。这使您不必担心窗格的大小。用户将通过任意坐标将几何对象定位在平面上,所以这很重要。好吧,无论如何,谢谢,我会再考虑一下。
【参考方案1】:
下面是一个简单的测试:
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);
双击添加一个新圆圈,用鼠标滚动(滚动按钮/滚轮或触控板上的滚动手势)移动。
这里有一些微妙之处。窗格最初的大小适合场景;当您滚动鼠标时,它将超出窗格的范围。如果您在窗格边界外双击(因此您添加了一个其参数在边界之外的新节点),则窗格会在该点展开以包含新子节点。
【讨论】:
以上是关于JavaFX 可拖动背景 - 替代使用相机?的主要内容,如果未能解决你的问题,请参考以下文章