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 可拖动背景 - 替代使用相机?的主要内容,如果未能解决你的问题,请参考以下文章

可拖动的 ngx-bootstrap 模态只有身体移动和背景固定

背景图像剪辑到可拖动的 div

在调整大小时调整可拖动对象背景图像的大小

JavaFX 容器可拖动

拖动png图像时是否可以删除背景颜色?

拖动背景图像