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

时间:2016-09-05 13:15:00

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

我是否认为无法在GridPane中拖动Shapes?这是一些代码的链接,允许用户在屏幕上拖动形状: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轴移动的任何输入?

1 个答案:

答案 0 :(得分:1)

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

如果您确实想使用GridPane,则在计算布局坐标后应用转换(例如翻译等),这样您就可以使用翻译(例如构建的翻译) -in使用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();
});