【问题标题】:Possible to Drag Shapes Within a GridPane with JavaFX可以使用 JavaFX 在 GridPane 中拖动形状
【发布时间】:2016-09-05 13:15:00
【问题描述】:

我认为不可能在 GridPane 中拖动形状是否正确?下面是一些允许用户在屏幕上拖动形状的代码的链接:Drag and Drop Shapes

我希望我的形状具有与上述相同的行为,但我希望它们在 GridPane 中(最终我希望将它们的移动锁定到 X 或 Y 轴以移动到相邻的形状)。

我将以下代码添加到“开始”方法中。它使用与示例代码相同的方法创建圆圈,但将它们添加到网格中。令人惊讶的是,这移除了它们被拖拽的能力。

GridPane grid = new GridPane();
grid.setLayoutX(300);
grid.setLayoutY(100);

int n = 3;
int m = 3;
for (int r = 0; r < n; r++) {
    for (int c = 0; c < m; c++) {

        Circle circle = createCircle(100, 50, 30, Color.BLACK);
        grid.add(circle, c, r);
    }
}
root.getChildren().add(grid);

如果你想对此进行测试,只需将上面的代码添加到示例代码的“start”方法中,就在这些行的上方:

primaryStage.setScene(scene);
primaryStage.show();

我的理论是 GridPane,因为它将圆圈锁定在某些位置,不允许这种拖动行为。

关于如何在拖动时实现圆圈沿 X 和 Y 轴移动的任何输入?

【问题讨论】:

    标签: java javafx drag-and-drop shapes gridpane


    【解决方案1】:

    通常,GridPane 等布局窗格管理其内容的放置。更改布局坐标不会影响放置在这些窗格中的节点。您可能会发现使用普通的 Pane 并自己管理布局以实现此类功能会更好。

    如果您确实想使用GridPane,则在计算布局坐标之后应用转换(例如平移等),因此您可以使用转换(例如内置的使用translateXtranslateY 属性)来管理布局窗格中的拖动。

    所以你可以这样做:

    circle.setOnMouseDragged((t) -> {
      double offsetX = t.getSceneX() - orgSceneX;
      double offsetY = t.getSceneY() - orgSceneY;
    
      // No idea why they are doing this. c is just circle
      Circle c = (Circle) (t.getSource());
    
      c.setTranslateX(c.getTranslateX() + offsetX);
      c.setTranslateY(c.getTranslateY() + offsetY);
    
      orgSceneX = t.getSceneX();
      orgSceneY = t.getSceneY();
    });
    

    【讨论】:

    • 这里的 orgSceneX 和 orgSceneY 定义在哪里?
    • @SiddharthDinesh 在 OP 链接中的代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2012-09-30
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多