当前位置: 首页 > 知识库问答 >
问题:

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

南门峰
2023-03-14

我是否正确地认为无法在网格窗格中拖动形状?下面是一些代码的链接,这些代码允许用户在屏幕上拖动形状:拖放形状

我希望我的形状具有与上述相同的行为,但我希望它们在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个答案

施旭东
2023-03-14

通常,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();
});
 类似资料:
  • 我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }

  • 注:用Java 25年,用Java FX 2.5小时(差不多)。 我希望能够突出显示鼠标拖动过的GridPane的所有单元格——即与被点击点和当前拖动点包围的矩形相交的所有单元格。如果所有的孩子都是1x1,我可以这样做,但是对于混合大小,我不高兴。 例如,如果第一行有1个1列单元格(A)和1个2列单元格(B ),第二行有1个2列单元格(C)和1个1列单元格(D ),如果我单击A并向下拖动到C中,我

  • 构造函数方法: PaintComponent方法和MouseDlold、MousePressed和MouseReleased方法:

  • 如何在JavaFX中组合形状(例如圆形)以拖动它们?示例代码基于 Oracle 教程。每个圆圈都可以移动。我想在拖动蓝色圆圈时单独移动它。我想在单击并拖动绿色圆圈时移动绿色和蓝色圆圈,并在单击并拖动红色圆圈时移动所有三个圆圈。有什么想法吗?

  • 我是JavaFx新手,我在FXMl中创建了两个gridPane,我想用JavaFx做同样的事情。 我想创建一个扩展GridPane的类,所以当我调用我的类时,我将得到与fxml PS中相同的结果:如果您使用的是SceneBuilder,请检查网格线是否可见,以便可以看到所有GridPane谢谢

  • 我确实知道VBox和HBox,这是我想要的,但我想有固定宽度的列元素。