JavaFX 可平移的 GridPane

JavaFX pannable GridPane

对于我当前的项目,我需要一个可以缩放和平移的具有透明背景的大型均匀网格。我最初尝试使用 ScrollPane 及其 setPannable(true),但很快发现滚动窗格背景将保持不透明,即使您调用 setStyle("-fx-background-color: transparent")setStyle("-fx-background: transparent")。因此,在删除了这个简单的选项后,我需要让有问题的 GridPane 直接平移。

我已经尝试了好几种方法,包括尝试将鼠标位置绑定到 GridPane 的翻译 属性(根本没用),但我没能成功更有希望正常工作的替代方案:

    GridPane gridView = new GridPane();
    int x;
    int y;
    gridView.setOnDragEntered( (event) -> {
        x = event.getX();
        y = event.getY();
    });
    gridView.setOnDragDetected( (event) -> {
        gridView.setTranslateX(X - event.getX());
        gridView.setTranslateY(Y - event.getY());
    });

但是,这只会使地图向上和向左跳动,而不是像预期的那样用鼠标缓慢平移。

设法解决了大部分问题。剩下的一个问题是 GridPane 平移时相当抖动,但目前处于可接受的水平。

    int x = 0;
    int y = 0;
    gridView.setOnMouseDragged((event) -> {
        if(x != 0){ //prevent from panning before values are initialized
            gridView.setTranslateX( gridView.getTranslateX() + limit(event.getX() - x, 25));
            gridView.setTranslateY( gridView.getTranslateY() + limit(event.getY() - y, 25));
        }
        x = (int)event.getX();
        y = (int)event.getY();
    });

其中Limit(double num, double limit)方法将输入num限制在[-limit, limit]范围内。降低限制会降低抖动,但同时也会降低响应速度。