2016-05-13 1 views
0

У меня проблема с перетаскиванием метки друг на друга. Я не смог перетащить ярлык и выбросить его на другой ярлык. Событие setOnDragDetected обнаружено, и setOnDragDropped не обнаружен. Это файлы.Java FX- Перемещение события drop and drop на Label

FXML:


  <HBox fx:id="hboxTwo" alignment="CENTER" spacing="100" style="-fx-background-color: orange;"> 
       <padding> 
        <javafx.geometry.Insets bottom="25" left="25" right="25" top="25" />  
       </padding> 
       <children> 
        <Label fx:id="labelTwo" prefHeight="50.0" text="labelTWO" /> 
       </children>  
      </HBox> 
     </children> 

    </HBox> 

</center> 

Контроллер:

общественного класса HomeController реализует Initializable {

@FXML 
Label labelOne; 

@FXML 
Label labelTwo; 

@FXML 
HBox hboxOne; 

@FXML 
HBox hboxTwo; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    labelOne.setOnDragDetected((MouseEvent event) -> { 
     System.out.println("source::" + event.getSource()); 
    }); 

    hboxTwo.setOnDragDropped((DragEvent event) -> { 
     event.acceptTransferModes(TransferMode.ANY); 
     System.out.println("source::" + event.getSource()); 
    }); 

    hboxTwo.setOnDragEntered((DragEvent event) -> { 
     event.acceptTransferModes(TransferMode.ANY); 
     System.out.println("source::" + event.getSource()); 
    }); 
} 

}

ответ

1

Просто скопировать и вставить ниже, соответствующий код для обнаружения сопротивления и падение с JavaFX 8 Drag and Drop tutorial.

Если сравнить образец кода в код, вы можете увидеть, что вам не хватает материал:

  1. Вы не строит Dragboard содержащий перетаскивания данных.
  2. Вы не извлекаете данные перетаскивания из Dragboard на капли.
  3. Вы не уведомляете о завершении события перетаскивания.
  4. Вы не соответствуете потребностям событий.

source.setOnDragDetected(new EventHandler<MouseEvent>() { 
    public void handle(MouseEvent event) { 
     /* drag was detected, start a drag-and-drop gesture*/ 
     /* allow any transfer mode */ 
     Dragboard db = source.startDragAndDrop(TransferMode.ANY); 

     /* Put a string on a dragboard */ 
     ClipboardContent content = new ClipboardContent(); 
     content.putString(source.getText()); 
     db.setContent(content); 

     event.consume(); 
    } 
}); 

target.setOnDragOver(new EventHandler<DragEvent>() { 
    public void handle(DragEvent event) { 
     /* data is dragged over the target */ 
     /* accept it only if it is not dragged from the same node 
     * and if it has a string data */ 
     if (event.getGestureSource() != target && 
       event.getDragboard().hasString()) { 
      /* allow for moving */ 
      event.acceptTransferModes(TransferMode.MOVE); 
     } 

     event.consume(); 
    } 
}); 

target.setOnDragDropped(new EventHandler<DragEvent>() { 
    public void handle(DragEvent event) { 
     /* data dropped */ 
     /* if there is a string data on dragboard, read it and use it */ 
     Dragboard db = event.getDragboard(); 
     boolean success = false; 
     if (db.hasString()) { 
      target.setText(db.getString()); 
      success = true; 
     } 
     /* let the source know whether the string was successfully 
     * transferred and used */ 
     event.setDropCompleted(success); 

     event.consume(); 
    } 
}); 
0

Чтобы setOnDragDropped работу, вы должны установить TransferMode ранее, и удалить согласно вызова метода в setOnDragDropped:

boxTwo.setOnDragOver((DragEvent event) -> { 
     event.acceptTransferModes(TransferMode.ANY); 
     event.consume(); 
}); 

boxTwo.setOnDragDropped((DragEvent event) -> { 
     Label source = (Label) event.getGestureSource(); 
     boxTwo.getChildren().add(source); 

     event.setDropCompleted() 
     event.consume(); 
});