2016-07-30 98 views
0

我正在尝试执行Drag &使用JavaFX从ListView中删除项目。所有处理程序都可以工作,例如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处理程序不会执行。所以你应该选择你想使用哪一个。

相关问题