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

JavaFX鼠标拖动事件未触发

卫沈义
2023-03-14

我尝试了几乎所有的方法,但是鼠标拖动事件没有触发,就像这里解释的那样:

https://openjfx.io/javadoc/11/javafx.graphics/javafx/scene/input/MouseDragEvent.html

下面是一个简单的示例,您可以尝试一下(我在JavaFX11.0.2中使用Java11):

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;


public class Main extends Application {

    private double mouseClickPositionX, mouseClickPositionY, currentRelativePositionX, currentRelativePositionY;

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Hello World");

        BorderPane mainBorderPane = new BorderPane();
        BorderPane centerBorderPane = new BorderPane();
        FlowPane flowPane = new FlowPane();
        GridPane gridPane = new GridPane();
        Button button1 = new Button("button1");
        gridPane.add(button1, 0, 0);
        flowPane.getChildren().add(gridPane);
        centerBorderPane.setCenter(flowPane);
        HBox hbox = new HBox();
        TilePane tilePane = new TilePane();
        Button button2 = new Button("button2");
        tilePane.getChildren().add(button2);
        hbox.getChildren().add(tilePane);
        mainBorderPane.setCenter(centerBorderPane);
        centerBorderPane.setBottom(hbox);

        // button2 event handlers

        button2.setOnMousePressed(event -> {
            mouseClickPositionX = event.getSceneX();
            mouseClickPositionY = event.getSceneY();
            currentRelativePositionX = button2.getTranslateX();
            currentRelativePositionY = button2.getTranslateY();
            button2.setMouseTransparent(true);
        });

        button2.setOnMouseDragged(event -> {
            button2.setTranslateX(currentRelativePositionX + (event.getSceneX() - mouseClickPositionX));
            button2.setTranslateY(currentRelativePositionY + (event.getSceneY() - mouseClickPositionY));
        });

        button2.setOnDragDetected(event -> {
            button2.startFullDrag();
        });

        button2.setOnMouseReleased((event) -> {
            button2.setMouseTransparent(false);
        });

        // button1 event handlers

        button1.setOnMouseDragReleased((event) -> {
            System.out.println("it works in button1");
        });

        // gridPane event handlers

        gridPane.setOnMouseDragReleased((event) -> {
            System.out.println("it works in gridPane");
        });

        primaryStage.setScene(new Scene(mainBorderPane, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

我想通过setonmousedragreeleedbutton1gridPane中获取button2的引用。有许多嵌套窗格等,因为我想保持原来的项目布局结构。我之所以这样做,是因为我不确定这是否也可能是无法正常工作的原因。

提前谢谢。

共有2个答案

夏兴平
2023-03-14

当此节点上的拖动结束时,MOUSE_DRAG_RELEASED触发。举个例子

 centerBorderPane.setOnMouseDragReleased((event) -> {
        System.out.println("centerBorderPane drag released");
 });

当您拖动按钮2并且拖动结束于中心边框窗格时,应触发。

要在鼠标拖动到按钮上时触发事件,请使用button1.setOnMouseDramed
如果要将鼠标事件从父级传播到其子级,请参阅以下内容

淳于祺
2023-03-14

我已经结束了手动触发事件从centerBorderPanegridPane,使用node.fire事件(事件)。还实现了一个helper函数,它返回正确的子节点:

  private Optional<Node> findNode(Pane pane, double x, double y) {
    return pane.getChildren().stream().filter(n -> {
      Point2D point = n.sceneToLocal(x, y);
      return n.contains(point.getX(), point.getY());
    }).findAny();
  }

不要忘记使用事件,这样您就不会进入无限循环。

 类似资料:
  • 拖放(Drag’n’Drop)是一个很赞的界面解决方案。取某件东西并将其拖放是执行许多东西的一种简单明了的方式,从复制和移动文档(如在文件管理器中)到订购(将物品放入购物车)。 在现代 HTML 标准中有一个 关于拖放的部分,其中包含了例如 dragstart 和 dragend 等特殊事件。 这些事件使我们能够支持特殊类型的拖放,例如处理从 OS 文件管理器中拖动文件,并将其拖放到浏览器窗口中。

  • 我准备好为此拔掉头发了。我正在开发游戏图形用户界面,它有一个由网格单元组成的地图。 单元格网格由StackPane组成,然后由ImageView或Shapes等组成的几个层组成。 整个内容包含在GridPane中,GridPane包含BorderPane的中心元素; 我不能在底层场景中添加鼠标事件,因为所有节点都会得到它- 下面是创建堆栈的代码: 这是设置EventHandler的代码- 谢谢你的

  • 有没有一种方法可以单击svg中的任何位置,并将元素捕捉到该位置,同时开始拖动? 我得到的最接近的是下面的代码。拖动圆可以工作,单击其他位置可以使圆移动到该位置,但我不知道如何在不释放鼠标并直接单击圆的情况下开始拖动。 更一般地说,如何在不直接与被拖动元素交互的情况下启动拖动行为? http://jsfiddle.net/Hj44M/1/

  • 问题内容: 我想通过覆盖JLabel上的鼠标事件来启用JLabel上的拖放功能,但是当我在mousePressed事件中定义拖放时,mouseReleased对该JLabel无效。难道我做错了什么 ? 缩略图是JLabel的数组 运行该程序时,拖放有效,但不会打印“此处释放鼠标”语句。但是,当我从mousePressed()方法中删除负责DND的代码时,将打印“此处释放了鼠标”。 这段代码有什么问

  • 我希望用户能够拖动并移动窗格周围的圆圈。圆圈似乎没有(几乎)记录任何鼠标事件(如最后定义的)。我有一个空窗格的完全相同的代码,它工作得很好。如果我改变 到 它工作得很好,但这不是我想要的,因为我需要操纵两个圆圈。有什么想法吗?如果您能告诉我如何隐藏圆圈中与相邻元素重叠的部分,如果它的中心太靠近窗格边框,我将不胜感激。 } 另一方面,这段代码应该做同样的事情,工作得非常完美

  • 当我从SWT的树查看器中拖放时,出现了以下问题。我正在设置< code>dragSourceEvent的图像属性,例如 除了在我的树查看器节点上有一个长标签的情况之外,它工作得很好。如果我有一个很长的字符串,并从节点标题的最右边开始拖动事件,我注意到拖动图像没有被正确锚定,实际上是根据从树节点字符串的开始到树节点字符串的结束的距离偏移了X个像素。 有人有什么建议吗?Yee可能需要演示一下才能了解它