JavaFX鼠标拖动事件未触发

JavaFX鼠标拖动事件未触发,java,javafx,mouseevent,drag,Java,Javafx,Mouseevent,Drag,我尝试了几乎所有的方法,但鼠标拖动事件没有触发,如下所述: 下面是一个简单的示例,您可以尝试一下(我在JavaFX11.0.2中使用Java11): 导入javafx.application.application; 导入javafx.scene.Parent; 导入javafx.scene.scene; 导入javafx.scene.control.Button; 导入javafx.scene.layout.*; 导入javafx.stage.stage; 公共类主扩展应用程序{ 专用双鼠标

我尝试了几乎所有的方法,但鼠标拖动事件没有触发,如下所述:

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

导入javafx.application.application;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.*;
导入javafx.stage.stage;
公共类主扩展应用程序{
专用双鼠标位置X、鼠标位置Y、currentRelativePositionX、currentRelativePositionY;
@凌驾
public void start(Stage primaryStage)引发异常{
setTitle(“你好世界”);
BorderPane Main BorderPane=新建BorderPane();
边框窗格中心边框窗格=新建边框窗格();
FlowPane FlowPane=新的FlowPane();
GridPane GridPane=新建GridPane();
按钮1=新按钮(“按钮1”);
添加(按钮1,0,0);
flowPane.getChildren().add(gridPane);
centerBorderPane.setCenter(流程窗格);
HBox HBox=新的HBox();
TilePane TilePane=新的TilePane();
按钮2=新按钮(“按钮2”);
tilePane.getChildren().add(按钮2);
hbox.getChildren().add(tilePane);
mainBorderPane.setCenter(中心边框窗格);
centerBorderPane.setBottom(hbox);
//按钮2事件处理程序
按钮2.设置鼠标按下(事件->{
mouseClickPositionX=event.getSceneX();
mouseClickPositionY=event.getSceneY();
currentRelativePositionX=按钮2.getTranslateX();
currentRelativePositionY=按钮2.getTranslateY();
按钮2.setMouseTransparent(true);
});
按钮2.SetOnMouseDrawed(事件->{
button2.setTranslateX(currentRelativePositionX+(event.getSceneX()-mouseClickPositionX));
button2.setTranslateY(currentRelativePositionY+(event.getSceneY()-mouseClickPositionY));
});
按钮2.setOnDragDetected(事件->{
按钮2.startFullDrag();
});
按钮2.setOnMouseReleased((事件)->{
按钮2.SetMouseTransport(假);
});
//button1事件处理程序
按钮1.SetonMousedragreeled((事件)->{
System.out.println(“它在按钮1中工作”);
});
//网格窗格事件处理程序
gridPane.setOnMousedragreeled((事件)->{
System.out.println(“它在gridPane中工作”);
});
初始阶段。设置场景(新场景(主边界窗格,300275));
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
我想通过
setonmousedragreeleed
button1
gridPane
中获取
button2
的引用。有许多嵌套窗格等,因为我想保持原来的项目布局结构。我之所以这样做,是因为我不确定这是否也可能是无法正常工作的原因

提前感谢。

拖动到此节点结束时激发。比如说

 centerBorderPane.setOnMouseDragReleased((event) -> {
        System.out.println("centerBorderPane drag released");
 });
当您拖动
按钮2
并且拖动结束于
中心边框窗格
时,应触发

要在鼠标拖动到按钮1上时触发事件,请使用按钮1。设置鼠标拖动
如果要将鼠标事件从父级传播到其子级,请参见

我已使用
节点.fireEvent(事件)
手动触发事件,从
中心边框窗格
网格窗格
。还实现了一个helper函数,该函数返回正确的子节点:

private可选findNode(窗格、双x、双y){
返回窗格.getChildren().stream().filter(n->{
点2d点=n.sceneToLocal(x,y);
返回n.contains(point.getX(),point.getY());
}).findAny();
}

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

不是100%确定,但可能是因为按钮有一个GridPane父级。尝试将它们添加到常规窗格。@塞德里克尝试将
网格窗格
更改为常规
窗格
,但仍然不工作事件未被触发,这就是问题所在。我的回答解释了为什么会触发
中心边界窗格
,但它不会传播到
按钮1
button2
是否在内部使用?如何更改此行为?但它不应该消耗任何东西,因为
setMouseTransparent(true)
根据
按钮1
应该首先被触发,因为它是最顶部的
节点