TornadoFX在TreeView上拖放

我是JavaFX的新手,因此也对TornadoFX感兴趣,请耐心等待。

我在Java中有一个简单的应用程序,但想把它移动到Kotlin,并遇到在TornadoFX中找到相应机制的问题。 我有一个ListViewIStoryItem代表故事和章节的实现。 我希望能够把章节转移,甚至从一个故事转移到另一个故事。 Java中的TreeView在其setCellFactory调用中有以下实现:

  tv.setCellFactory(new Callback<TreeView<IStoryItem>, TreeCell<IStoryItem>>() { @Override public TreeCell<IStoryItem> call(TreeView<IStoryItem> siTreeView) { TreeCell<IStoryItem> cell = new TreeCellStoryEditor(); cell.setOnDragDetected((MouseEvent event) -> { // Don't drag Story nodes. if (cell.getItem() instanceof Story) return; Dragboard db = cell.startDragAndDrop(TransferMode.MOVE); // Put the Part on the dragboard // From: https://stackoverflow.com/a/30916660/780350 ClipboardContent content = new ClipboardContent(); content.put(objectDataFormat, cell.getItem()); db.setContent(content); event.consume(); }); cell.setOnDragOver((DragEvent event) -> { if (event.getGestureSource() != cell && event.getDragboard().hasContent(objectDataFormat)) { /* allow for moving */ event.acceptTransferModes(TransferMode.MOVE); } event.consume(); }); cell.setOnDragEntered((DragEvent event) -> { IStoryItem item = cell.getItem(); if (item instanceof Story && event.getGestureSource() != cell && event.getDragboard().hasContent(objectDataFormat)) { cell.setUnderline(true); } event.consume(); }); cell.setOnDragExited((DragEvent event) -> { cell.setUnderline(false); event.consume(); }); cell.setOnDragDropped((DragEvent event) -> { try { Dragboard db = event.getDragboard(); boolean success = false; if (db.hasContent(objectDataFormat)) { Part droppedPart = (Part)db.getContent(objectDataFormat); IStoryItem targetStoryItem = cell.getItem(); // Question: How to handle drops between leaf items or // before the initial leaf or after the final leaf. if (targetStoryItem instanceof Story) { Story story = (Story) targetStoryItem; updateStoryWith(droppedPart, story); addPartTo(cell.getTreeItem(), droppedPart); success = true; } } event.setDropCompleted(success); event.consume(); } catch (Exception e) { System.out.println(e.getMessage()); } }); cell.setOnDragDone((DragEvent event) -> { if (event.getTransferMode() == TransferMode.MOVE) { IStoryItem item = cell.getItem(); TreeItem<IStoryItem> ti = cell.getTreeItem(); TreeItem<IStoryItem> pti = ti.getParent(); pti.getChildren().remove(ti); IStoryItem psi = pti.getValue(); // Remove the Part/Chapter from its previous Story boolean removed = removePartFrom(psi, item); } event.consume(); }); cell.setEditable(true); return cell; }; }); 

我曾在TornadoFX中寻找过类似的东西,但找不到任何看起来可以工作的东西。 我已经在使用cellFormat构建器,但我不知道如何添加事件处理程序。 我从IntelliJ的intellisense中看到,还有一个cellFactory构建器,但我不知道如何使用它或如何将事件处理程序添加到它。

您可以在TornadoFX中使用完全相同的技术。 请记住,TornadoFX只是在JavaFX上应用高级API。 您仍可以始终访问底层的JavaFX API。

 tv.setCellFactory { object : TreeCell<IStoryItem>() { init { setOnDragOver { event -> } setOnDragEntered { event -> } setOnDragExited { event -> } setOnDragDropped { event -> } } } }