Я пытаюсь реализовать 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.