JavaFX OnDragDropped未注册

我试图将标签拖放到彼此之上。

我有一个名为starsAndBars的标签列表,每个标签在创建时都会调用它:

private void giveDragAndDropProperties(Label label) { //Enable drag actions to pick up the label label.setOnDragDetected(new EventHandler() { public void handle(MouseEvent event) { System.out.println("Drag and drop started!"); Dragboard db = label.startDragAndDrop(TransferMode.ANY); ClipboardContent content = new ClipboardContent(); int index = starsAndBars.indexOf(label); content.putString("test"); db.setContent(content); event.consume(); } }); label.setOnDragEntered(new EventHandler() { public void handle(DragEvent event) { System.out.println("drag entered!"); } }); label.setOnDragExited(new EventHandler() { public void handle(DragEvent event) { System.out.println("drag left!"); } }); //Enable a label to be dropped on this label label.setOnDragDropped(new EventHandler() { public void handle(DragEvent event) { System.out.println("Drop occurred!"); } }); } 

当我尝试执行拖放操作时,这就是我所看到的:

 Drag and drop started! drag entered! drag left! drag entered!  drag left! 

据我所知,“onDragDropped”事件从未注册过。 我究竟做错了什么? 我可以告诉每个Label都有拖放事件处理程序,因为它们注册了“已输入”和“已退出”事件。 这是处理拖放事件处理程序的唯一代码 – 因此它应首先被其他东西使用。

所有这些标签都在ScrollPane中的HBox中,如果这有任何区别的话。

编辑:我现在尝试在HBox上放置一个drop事件,标签包含在同一个结果中 – 它似乎永远不会被调用。 我的setOnDragDropped代码与我的另一个例子中的代码基本相同。

我试过重写我的setOnDragDetected和setOnDragDropped,我试图尽可能地将它们与这个例子( http://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm )进行匹配,以前为我工作过。

编辑2:我有另一个项目,当前有拖放事件处理与此非常相似的事件,虽然有不同的对象 – 我已经尝试从该项目复制源(并更改变量名称)没有运气。 如果可能有帮助,我也可以包含该来源。 但它基本上是一样的。

还有什么可以帮助我找到答案?

您需要在setOnDragOver接受传输模式,如下所示:

 label.setOnDragOver(new EventHandler () { public void handle(DragEvent event) { event.acceptTransferModes(TransferMode.ANY); event.consume(); } });