可以使用 JavaFX 在 GridPane 中拖动形状

Possible to Drag Shapes Within a GridPane with JavaFX

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

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

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

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 轴移动的任何输入?

一般来说,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();
});