Я пытаюсь реализовать перетаскивание в виде дерева. Я действительно сделал это. Это
работает. В 1/3 раза.
В противном случае бывают случаи, когда соответствующие события не поступают, и события
удар из ниоткуда.
В частности, я не вижу события dragDone
для запуска, хотя я звоню
setDropCompleted(true)
в событии dragDropped
.
Если я провожу ручное тестирование, я просто не вижу большой корреляции между событиями
Прибытие и движения мыши я делаю.
dragDropped
события произошли из ниоткуда, некоторые клетки получают
dragEnter/Exit/Over
событие, некоторые нет, источник события установлен на
загадочные ценности.
Вот как я тестирую (полный код см. DragAndDropTest.java ):
@Test
public void
when_the_drag_is_dropped_the_element_is_moved(
final FxRobot robot
) {
final ZentaTreeCell startCell = findCellFor(newElement);
robot.drag(startCell);
final ZentaTreeCell targetCell = findCellFor(thing);
final int targetIndex = targetCell.getIndex();
robot.moveTo(targetCell);
robot.dropTo(targetCell);
WaitForAsyncUtils.waitForFxEvents();
final ZentaTreeCell endCell = findCellFor(newElement);
assertEquals(targetIndex + 1, endCell.getIndex());
}
И это соответствующие строки моей TreeCell
реализации ( ZentaTreeCell для полного кода):
public class ZentaTreeCell extends TreeCell < ZentaElement > {
public static final DataFormat ZENTA_FORMAT =
new DataFormat("Zenta Elements");
private final TreeView < ZentaElement > treeView;
public ZentaTreeCell(final TreeView < ZentaElement > view) {
super();
treeView = view;
setOnDragDetected((e) - > dragDetected(e));
setOnDragEntered((e) - > dragEntered(e));
setOnDragOver((e) - > dragOver(e));
setOnDragExited((e) - > dragExited(e));
setOnDragDropped((e) - > dragDropped(e));
setOnDragDone((e) - > dragDone(e));
}
private void dragDone(final DragEvent e) {
System.out.println("done\n\tat " + this + "\n\t event: " + e);
}
private void dragDropped(final DragEvent e) {
System.out.println("dropped\n\tat " + this + "\n\t event: " + e);
e.setDropCompleted(true);
e.getDragboard().clear();
e.consume();
getStyleClass().remove("dragtarget");
final ZentaTreeCell gestureSource = (ZentaTreeCell)
e.getGestureSource();
final ZentaTreeCell gestureTarget = (ZentaTreeCell)
e.getGestureTarget();
final TreeItem < ZentaElement > draggedItem = gestureSource.getTreeItem();
final TreeItem < ZentaElement > draggedItemParent =
draggedItem.getParent();
final TreeItem < ZentaElement > droppeditem = gestureTarget.getTreeItem();
final TreeItem < ZentaElement > droppedItemParent =
droppeditem.getParent();
final int indexInParent =
droppedItemParent.getChildren().indexOf(droppeditem);
draggedItemParent.getChildren().remove(draggedItem);
droppedItemParent.getChildren().add(indexInParent + 1, draggedItem);
treeView.getSelectionModel().select(draggedItem);
}
private void dragOver(final DragEvent e) {
System.out.println("over\n\tat " + this + "\n\t event: " + e);
e.acceptTransferModes(TransferMode.MOVE);
e.consume();
}
private void dragEntered(final DragEvent e) {
System.out.println("entered\n\tat " + this + "\n\t event: " + e);
getStyleClass().add("dragtarget");
e.consume();
}
private void dragExited(final DragEvent e) {
System.out.println("exited\n\tat " + this + "\n\t event: " + e);
getStyleClass().remove("dragtarget");
e.consume();
}
public void dragDetected(final MouseEvent e) {
System.out.println("detected\n\tat " + this + "\n\t event: " + e);
System.out.println("dragDetected");
final Dragboard dragBoard = startDragAndDrop(TransferMode.MOVE);
final Map < DataFormat, Object > map = new HashMap < > ();
final ZentaElement item = getItem();
map.put(ZENTA_FORMAT, item);
System.out.println("item: " + item);
dragBoard.setContent(map);
e.consume();
}
}
Полагаю, что-то здесь не хватает, но после прочтения всех
документация о перетаскивании, я не вижу, что.