私はJavaFXを初めて使用しているので、TornadoFXにも慣れていますので、私にご負担ください。TornadoFXツリービューでのドラッグアンドドロップ
私はJavaで単純なアプリケーションを持っていますが、それをKotlinに移したいと思い、TornadoFXの対応するメカニズムを見つけるのに問題が発生しています。ストーリーとチャプターを表すIStoryItem
の実装を保持しているListView
があります。私はチャプターを周りに、そしてあるストーリーから別のストーリーにも移動できるようにしたい。私はTornadoFXで似た何かを見てきましたが、それはうまくいくように見える何かを見つけることができません
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;
};
});
:JavaでTreeView
は、そのsetCellFactory
呼び出しで次のような実装を持っています。すでにcellFormat
ビルダーを使用していますが、イベントハンドラを追加する方法がわかりません。 IntelliJのインテリセンスからは、cellFactory
ビルダーもありますが、その使用方法やイベントハンドラを追加する方法がわかりません。
これは私にとっては奇妙な構文です。 'setCellFactory'メソッドは、(' call'メソッドを使って)Callbackオブジェクトを受け取ります。それはあなたがここに持っているものにどのように変換されますか? – melston
@melston SAM変換(SAM = Single Abstract Method)と呼ばれています。より多くの情報はここにあります:https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions –
@ RuckusT-Boom、私がSAMコンストラクタについて見たすべての記述から、私はその例を考えていただろうオブジェクト:コールバック{...} ' – melston