2016-07-30 2 views
0

Я пытаюсь реализовать Drag & Извлеките элемент из ListView с помощью JavaFX. Все обработчики работают, например, onDragDetected, onDragEnter, кроме onDragDrop.JavaFX OnDragDrop обработчик не работает

есть toolbax.fxml который имеет listView и включен в main.fxml.

Вот разделы моих кодов:

toolbax.fxml:

<ListView fx:id="source" layoutX="-9.0" prefHeight="200.0" prefWidth="200.0"> 
     <items> 
       <FXCollections fx:factory="observableArrayList" > 
        <HBox onDragDetected="#handleDragDetected" onDragDone="#handleDragDone" > 
        <children> 
         <ImageView> 
          <image> 
            <Image requestedHeight="40" requestedWidth="40" url="@/resources/computer.png" /> 
          </image> 
         </ImageView> 
         <Text text="Host" /> 
        </children> 
        </HBox> 
        <HBox> 
        <children> 
         <ImageView> 
          <image> 
           <Image requestedHeight="40" requestedWidth="40" url="@/resources/server.png" /> 
          </image> 
         </ImageView> 
         <Text text="Server" /> 
        </children> 
        </HBox> 
       </FXCollections> 

     </items> 
    </ListView> 

toolbaxController:

public class ToolboxController { 
@FXML 
private ListView<FXCollections> source; 
public static DataFormat dataFormat = new DataFormat("myCell"); 

@FXML 
private void handleDragDetected(MouseEvent event) 
{ 



    System.out.println("onDragDetected"); 

    Dragboard db=source.startDragAndDrop(TransferMode.MOVE); 

    int id=source.getSelectionModel().getSelectedIndex(); 
    ClipboardContent content = new ClipboardContent(); 
    content.put(dataFormat,id); 
    db.setContent(content); 

    event.consume(); 


} 


@FXML 
void handleDragDone(DragEvent event) 
{ 

    System.out.println("onDragDone"); 

    if(event.getTransferMode()==TransferMode.MOVE) 
    { 
     // source 
    } 
    event.consume(); 
} 

}

main.fxml:

<center> 
    <AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
    <children> 
     <ImageView onDragDropped="#handleDragDrop" onDragEntered="#handleDragEntered" onDragExited="#handleDragExited" onDragOver="#handleDragOver" fx:id="target" fitHeight="253.0" fitWidth="320.0" layoutX="42.0" layoutY="80.0" pickOnBounds="true" preserveRatio="true" /> 
    </children></AnchorPane> 

mainController:

public class MainController { 
@FXML 
private ImageView target; 




@FXML 
void handleDragOver(DragEvent event) 
{ 
    System.out.println("onDragOver"); 

    if (event.getGestureSource() != target && 
      event.getDragboard().hasString()) { 
     target.setStyle("-fx-background-color: aqua"); 
     /* allow for both copying and moving, whatever user chooses */ 
     event.acceptTransferModes(TransferMode.MOVE); 
    } 

    event.consume(); 
} 

@FXML void handleDragEntered(DragEvent event) 
{ 
    System.out.println("onDragEntered"); 
    if (event.getGestureSource() != target && 
      event.getDragboard().hasString()) { 
     target.setStyle("-fx-background-color:brown"); 
    } 

    event.consume(); 

} 

@FXML 
void handleDragExited(DragEvent event) 
{ 
    System.out.println("onDragExited"); 

    target.setStyle("-fx-background-color:darkblue"); 


    event.consume(); 
} 
@FXML 
public void handleDragDrop(DragEvent event) 
{ 

    System.out.println("onDragDrop"); 
    Object obj; 
    Dragboard db = event.getDragboard(); 
    boolean success = false; 
    if (db.hasContent(ToolboxController.dataFormat)){ 
     obj=db.getContent(ToolboxController.dataFormat); 
     success = true; 
     System.out.println("onDragDrop"); 
    } 
    /* let the source know whether the string was successfully 
    * transferred and used */ 
    event.setDropCompleted(success); 

    event.consume(); 
} 

}

и его мой выходной, когда я перетащить элемент из ListView на ImageView:

onDragDetected

onDragEntered

OnDragOver

OnDragOver

OnDragOver

OnDragOver

onDragExited

, что означает, что handleDragDrop не выполняет. Интересно, может быть, проблема - цель, я имею в виду, что цель не должна быть AnchorPane или ImageView.

ответ

0

Наконец-то я нашел Ansewer, это было так глупо :), когда вы используете обработчик onDragExited, обработчик OnDragDrop не выполняется. Поэтому вы должны выбрать, какой из них вы хотите использовать.