返回

JavaFX中如何让拖放图像始终保持在杆子上?

java

解决 JavaFX 拖放中幽灵图像跟随问题:保持图像始终在杆子上

问题概述

在 JavaFX 应用程序中,使用 Abakus 拖拽控件拖动图像时,拖动的小球会脱离杆子,导致用户体验不佳。本文深入探讨问题根源,提供解决方案,并讨论保持拖放图像在特定 Y 轴位置的可能性。

问题分析

问题出在 makeImageDragNDrop 方法中,该方法仅设置了拖放视图在光标上的偏移量,而不是图像本身在窗口中的位置。

解决方案

  1. 将幽灵图像包装在 Label 中,以便控制其位置。
  2. 记录鼠标按下时的幽灵图像 Y 轴位置(杆子的位置)。
  3. 在拖拽过程中,根据鼠标当前位置更新幽灵图像的 Y 轴位置,使其始终与杆子对齐。

代码示例

private Label ghostLabel;
private double yValue;

protected void makeImageDragNDrop(ImageView imageView) {
    imageView.setOnDragDetected(event -> {
        ghostLabel = new Label("", new ImageView(ghostImage));
        dragboard.setDragView(ghostLabel);
        ...
    });

    imageView.setOnMousePressed(event -> {
        yValue = ghostLabel.getTranslateY();
    });

    imageView.setOnDragOver(event -> {
        ghostLabel.setTranslateY(event.getY() - yValue);
    });

    imageView.setOnDragDone(event -> {
        if (event.getTransferMode() == null) {
            ghostLabel.setTranslateY(yValue);
        }
    });
}

保持图像在特定 Y 轴位置的讨论

在某些情况下,由于拖拽图像和目标区域的实现方式,无法将拖拽图像保持在特定 Y 轴位置。但通过对拖拽图像的位置进行动态调整,通常可以实现类似的效果。

结论

本文提供了解决 JavaFX 中拖拽小球时保持其始终附着在杆子上的方法。通过动态调整幽灵图像的 Y 轴位置,我们可以确保小球在拖拽过程中始终与杆子对齐。

常见问题解答

  1. 为什么幽灵图像一开始会脱离杆子?

    • 这是由于错误地设置了拖拽视图的偏移量,而不是幽灵图像在窗口中的位置。
  2. 为什么需要将幽灵图像包装在 Label 中?

    • Label 允许我们直接控制图像在窗口中的位置,而不影响拖拽视图。
  3. 为什么需要记录鼠标按下时的 Y 轴位置?

    • 这是杆子的位置,我们以此作为幽灵图像 Y 轴位置的参考点。
  4. 如何调整幽灵图像的 Y 轴位置?

    • 我们根据鼠标当前位置更新幽灵图像的 TranslateY 属性,使其与杆子对齐。
  5. 在哪些情况下无法将拖拽图像保持在特定 Y 轴位置?

    • 具体取决于拖拽图像和目标区域的实现方式,有时无法强制限制图像的位置。