gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:32:00 32 4
gpt4 key购买 nike

我认为不可能在 GridPane 中拖动形状是否正确?以下是一些代码的链接,允许用户在屏幕上拖动形状: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 轴移动的任何输入?

最佳答案

一般来说,布局 Pane (例如 GridPane)管理其内容的放置。更改布局坐标不会影响放置在这些 Pane 中的节点。您可能会发现最好使用普通的 Pane 并自行管理布局以实现此类功能。

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

所以你可以这样做:

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

关于java - 可以使用 JavaFX 在 GridPane 中拖动形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331435/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com