2014-07-14 75 views
4

我想拖放标签在彼此之上。JavaFX OnDragDropped没有注册

我有标签叫starsAndBars的列表,每个标签都有,因为它创造了这个调用它:

private void giveDragAndDropProperties(Label label) { 
    //Enable drag actions to pick up the label 
    label.setOnDragDetected(new EventHandler<MouseEvent>() { 
     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<DragEvent>() { 
     public void handle(DragEvent event) { 
      System.out.println("drag entered!"); 
     } 
    }); 

    label.setOnDragExited(new EventHandler<DragEvent>() { 
     public void handle(DragEvent event) { 
      System.out.println("drag left!"); 
     } 
    }); 

    //Enable a label to be dropped on this label 
    label.setOnDragDropped(new EventHandler<DragEvent>() { 
     public void handle(DragEvent event) { 
      System.out.println("Drop occurred!"); 
     } 
    }); 
} 

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

Drag and drop started! 
drag entered! 
drag left! 
drag entered! 
<I release the mouse here> 
drag left! 

据我所知,“onDragDropped”事件从不登记。我究竟做错了什么?我可以告诉每个Label都有拖放事件处理程序,因为它们注册了“进入”和“退出”事件。这是处理拖放事件处理程序的唯一代码 - 所以它应该首先被其他东西消费。

所有这些标签都位于ScrollPane内的HBox,如果这有什么区别的话。

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

我试图重写我的两个setOnDragDetected和setOnDragDropped,和我试图尽可能与他们这个例子(http://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm)成为可能,这为我工作过。

编辑2:我有另一个项目,目前有拖放事件处理事件非常接近完全相同,但具有不同的对象 - 我试图从没有运气的项目(并更改变量名称)复制源。如果可能有帮助,我也可以包含该来源。但它基本上是一样的。

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

回答

6

你需要接受的传送模式setOnDragOver,像这样:

label.setOnDragOver(new EventHandler <DragEvent>() { 

    public void handle(DragEvent event) { 
     event.acceptTransferModes(TransferMode.ANY); 
     event.consume(); 
    } 
});