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。