JavaFX - 在TreeView中向下移动TreeItem

时间:2014-11-12 05:46:44

标签: java javafx treeview

我有一个看起来像这样的树视图。

-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

3 个答案:

答案 0 :(得分:3)

我建议使用SortedList而不是ObservableList作为JavaFX TreeView的支持列表。

SortedList上有一个comparatorProperty,无论何时更改,List都会相应地重新排序。像饼一样容易; - )

答案 1 :(得分:1)

您必须将TreeItem移动到其父子列表中。

  1. 如果您使用视图 - 控制器 - 模型设置,在模型中进行重新排序,树将相应更新
  2. 如果您只想更改视图而不是模型在自己的TreeItem实现的getChildren()方法中使用重新排序
  3. 如果您的视图也代表模型(数据本身),那么您可以使用下面的代码。
  4. 在要向上移动的节点上运行以下方法:

    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);
        }
    }

}