【问题标题】:JavaFX pannable GridPaneJavaFX 可平移的 GridPane
【发布时间】:2017-01-20 08:59:48
【问题描述】:

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

我已经尝试了几件事,包括尝试将鼠标位置绑定到GridPane 的 Translate 属性(这根本不起作用),但我没有找到更有希望的替代方法来正常工作:

    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());
    });

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

【问题讨论】:

  • 你可以在画布上使用画线而不是网格窗格吗?
  • 我不这么认为,因为网格上的每个方格都需要包含一个节点,该节点会根据其位置和该方格内表示的数据触发事件。
  • 看看这个,看看你是否可以使用它。 stackoverflow.com/questions/33534594/generating-an-n-x-n-grid/…。它在 Swing 中,但您可以将其转移到 FX。此外,Spanning 和 Zooming 可以是改变 x 和 y 位置的另一个属性。如果此解决方案可以接受,我将帮助您编写缩放和平移代码。
  • 您能否将 GridPane 放置在 ScrollPane 内的 StackPane 中,让需要显示在 StackPane 下方网格下方的内容?

标签: java javafx pan gridpane


【解决方案1】:

设法大致弄清楚了。剩下的一个问题是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] 范围内。降低限制会降低抖动,但这样做的代价是降低响应能力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2020-04-27
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多