javafx 11 запускает события случайно? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь реализовать перетаскивание в виде дерева. Я действительно сделал это. Это работает. В 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();
    }

}   

Полагаю, что-то здесь не хватает, но после прочтения всех документация о перетаскивании, я не вижу, что.

...