我有一个看起来像这样的树视图。
-Root
--Parent 1
----Child 1
----Child 2
----Child 3
--Parent 2
----Child 1
----Child 2
我已经遍布SO和Google,但我无法找到在树状列表中上下移动TreeItems的正确方法。这可能吗?
我不是在谈论只是移动child
节点,而是当我移动父母时,我也需要孩子们随身携带它们。所以移动Parent 2
就像这样。
-Root
--Parent 2
----Child 1
----Child 2
--Parent 1
----Child 1
----Child 2
----Child 3
答案 0 :(得分:3)
我建议使用SortedList
而不是ObservableList
作为JavaFX TreeView
的支持列表。
在SortedList
上有一个comparatorProperty
,无论何时更改,List
都会相应地重新排序。像饼一样容易; - )
答案 1 :(得分:1)
您必须将TreeItem移动到其父子列表中。
在要向上移动的节点上运行以下方法:
static void moveUp(TreeItem item) {
if (item.getParent() instanceof TreeItem) {
TreeItem parent = item.getParent();
List<TreeItem> list = new ArrayList<TreeItem>();
Object prev = null;
for (Object child : parent.getChildren()) {
if (child == item) {
list.add((TreeItem)child);
} else {
if (prev != null) list.add((TreeItem)prev);
prev = child;
}
}
if (prev != null) list.add((TreeItem)prev);
parent.getChildren().clear();
parent.getChildren().addAll(list);
}
}
这是某种丑陋的Java代码,但有效。下移是类似的。
随着TreeView自动重绘,孩子们将关注
答案 2 :(得分:0)
public void moveDown() {
if (selectedItem != null) {
TreeItem item = selectedItem;
int index = item.getParent().getChildren().indexOf(item);
if(index != item.getParent().getChildren().size()-1)
{
TreeItem safeItem = (TreeItem) item.getParent().getChildren().get(index+1);
item.getParent().getChildren().set(index+1, item);
item.getParent().getChildren().set(index, safeItem);
}
}
}