[英]Possible to Drag Shapes Within a GridPane with JavaFX
我是否认为无法在GridPane中拖动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轴运动的任何输入?
通常,布局窗格(例如GridPane
管理其内容的放置。 更改布局坐标不会影响放置在这些窗格中的节点。 您可能会发现最好使用纯Pane
并自己管理布局以实现诸如此类的功能。
如果您确实想使用GridPane
,则在计算布局坐标后将应用转换(例如平移等),因此您可以使用平移(例如,一个内置了translateX
和translateY
属性的translateX
)来管理拖动布局窗格。
因此,您可以执行以下操作:
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();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.