2014-07-14 2 views
4

서로의 위에 레이블을 끌어다 놓으려고합니다.JavaFX OnDragDropped 등록하지 않음

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!"); 
     } 
    }); 
} 

내가 드래그를 수행하고 드롭 조작을 시도, 이것은 내가 볼 것입니다 :

나는 starsAndBars라는 라벨의 목록을 가지고 있고,이 생성 될 때마다 라벨이 그것에 요구했다 :

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

"onDragDropped"이벤트는 내가 알 수있는 한 등록하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는 "입력 된"이벤트와 "종료 된"이벤트를 등록하기 때문에 각 레이블에 끌어서 놓기 이벤트 처리기가 있다는 것을 알 수 있습니다. 이것은 끌어서 놓기 이벤트 처리기를 다루는 유일한 코드 조각이므로 먼저 다른 것으로 소비되어야합니다.

모든 레이블이 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(); 
    } 
}); 
관련 문제