Javafx 拖动时从场景图中删除拖动目标时没有事件

Javafx 拖动时从场景图中删除拖动目标时没有事件,javafx,javafx-2,Javafx,Javafx 2,JavaFX场景具有从区域继承的类对象。此对象具有鼠标拖动事件的处理程序。调用此处理程序时,将删除对象的所有子节点并添加新的子节点。问题是,当从我的对象中删除所有子对象时,它不再接收任何事件,因为鼠标拖动事件的目标是删除子节点。如何解决 我无法使用setMouseTransparent方法,因为我的对象中的某些元素具有鼠标事件处理程序。好的,也许我有问题: 一个地区有很多孩子。如果用户在这些子项上单击并拖动鼠标,这些子项将被修改甚至删除。由于鼠标拖动事件“锁定”到拖动开始的第一个子项,因此如果将

JavaFX场景具有从区域继承的类对象。此对象具有鼠标拖动事件的处理程序。调用此处理程序时,将删除对象的所有子节点并添加新的子节点。问题是,当从我的对象中删除所有子对象时,它不再接收任何事件,因为鼠标拖动事件的目标是删除子节点。如何解决


我无法使用setMouseTransparent方法,因为我的对象中的某些元素具有鼠标事件处理程序。

好的,也许我有问题:

一个地区有很多孩子。如果用户在这些子项上单击并拖动鼠标,这些子项将被修改甚至删除。由于鼠标拖动事件“锁定”到拖动开始的第一个子项,因此如果将鼠标拖动到其他一些子项上,其他子项将不会收到进一步的事件

您可能会受益于这样一个事实,即MouseDrag事件在移除子区域后传递给父区域。因此,可以在接收该事件的独立regon上注册onmousedrable处理程序。现在,处理程序可以使用event.getPickEvent()在鼠标下方“拾取”任何子对象以执行进一步的操作:

void mouseDragPop(窗格区域){
region.setonMouseDrawed(e->{
Node Node=e.getPickResult().getIntersectedNode();
if(圆的节点实例){
region.getChildren().remove(节点);
}
});
对于(int i=1;i<10;i++){
最终int n=i;
圆圈=新圆圈(20);
圆。setTranslateX(0);
圆.setTranslateY(0);
圆。设置填充(颜色。rgb(180200170));
circle.setLayoutX(System.nanoTime()/1000%200);
circle.setLayoutY(System.nanoTime()/3000%100);
region.getChildren().add(圆);
circle.setonMouseDrawed(e->{
region.getChildren().remove(圆);
e、 消费();
});
}
}
现在,您可以点击并“弹出”鼠标拖动方式的所有圆圈。。。

我没有问题。您有一个显示了一些子项的区域。这些孩子很难对付。。。预期的行为是什么?如果孩子们被拖走了,该地区会被通知吗?@Jens-peterhack我不想拖孩子们。当用户按住鼠标左键或在按住鼠标左键的同时在区域上移动鼠标时,我需要更改区域中的节点。此外,当用户按下鼠标(MouseEvent.mouse_PRESSED)时,我需要相同的行为。因此,同样,向上传递事件并在区域上处理。使用getPickEvent()重新聚焦鼠标下方的子对象并执行操作。。。您还可以将“pick事件”传递给拾取的子节点的事件处理程序。您可能会受益于这样一个事实,即MouseDrag事件在移除子节点后传递给父区域。我使用JavaFX2.2。对于这个版本的javafx,情况并非如此。但我理解你的想法,我可以做类似的事情。
void mouseDragPop(Pane region) {
    region.setOnMouseDragged(e -> {
        Node node = e.getPickResult().getIntersectedNode();
        if (node instanceof Circle) {
            region.getChildren().remove(node);
        }
    });

    for (int i = 1; i < 10; i++) {
        final int n = i;
        Circle circle = new Circle(20);
        circle.setTranslateX(0);
        circle.setTranslateY(0);
        circle.setFill(Color.rgb(180,  200,  170));
        circle.setLayoutX(System.nanoTime()/1000 % 200);
        circle.setLayoutY(System.nanoTime()/3000 % 100);
        region.getChildren().add(circle);

        circle.setOnMouseDragged(e -> {
            region.getChildren().remove(circle);
            e.consume();
        });
    }
}