2014-07-14 70 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(); 
    } 
});