我是否认为无法在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轴移动的任何输入?
答案 0 :(得分:1)
通常,GridPane
等布局窗格会管理其内容的展示位置。更改布局坐标不会影响放置在这些窗格中的节点。您可能会发现使用普通Pane
更好,并自行管理布局以实现此功能。
如果您确实想使用GridPane
,则在计算布局坐标后应用转换(例如翻译等),这样您就可以使用翻译(例如构建的翻译) -in使用translateX
和translateY
属性来管理布局窗格中的拖动。
所以你可以这样做:
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();
});