JavaFX OnDragDrop 处理程序不起作用

JavaFX OnDragDrop handler doesn't work

我正在尝试使用 JavaFX 从 ListView 中拖放项目。除了 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>

主控制器:

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 不会 execute.I 想知道问题可能出在目标上,我的意思是目标不能是 AnchorPane 或 ImageView 。

最后,我找到了 Ansewer,它太愚蠢了 :),当您使用 onDragExited 处理程序时,您的 OnDragDrop 处理程序不会执行。所以你应该选择你想使用的那个。