저는 JavaFX를 처음 사용하고 있으므로 TornadoFX에도 익숙하지 않으므로 부담하십시오.TornadoFX TreeView에서 드래그 앤 드롭
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;
};
});
: 자바의 TreeView
는 setCellFactory
호출에서 다음과 같은 구현을 가지고 있습니다. 이미 cellFormat
빌더를 사용하고 있지만 내부에 이벤트 핸들러를 추가하는 방법을 알 수 없습니다. IntelliJ의 인텔리 센스에서 볼 때 cellFactory
빌더가 있지만 사용 방법이나 이벤트 핸들러를 추가하는 방법을 잘 모르겠습니다.
이것은 이상한 구문입니다. 'setCellFactory' 메쏘드는 Callback 객체를 취합니다 ('call' 메쏘드 사용). 그것은 당신이 여기있는 것과 어떻게 번역됩니까? – melston
@melston SAM 변환 (SAM = Single Abstract Method)이라고합니다. 자세한 내용은 여기를 참조하십시오. https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions –
@ RuckusT-Boom, SAM 생성자에 대한 모든 설명에서 예를 들어 보았을 것입니다. 'object : Callback {...}'이었을 것입니다. – melston