0

我已经使用 sencha GXT 几天了,我目前正在尝试在代表不同文件系统的两棵树之间进行 Drag'n'drop 工作。这意味着可以将重复文件复制到一个系统的多个不同文件夹中 - 但由于该文件具有相同的密钥,因此树存储中断。

到目前为止我已经尝试过的结果:

  • 尝试:在 TreeDropHandler/TreeMoveHandler 中做事
  • 结果:原来这些是用于移动小部件时的

  • 尝试:覆盖 TreeDataStore 并覆盖 add 方法

  • 结果:在拖放到树中时甚至没有调用 add 方法 - 似乎它们只是用于手动将东西添加到树存储中

  • 尝试:只需复制整个树存储并对其进行修改以按我的方式工作

  • 结果:不幸的是,Tree 需要 treestore 类,而不是实现某些抽象类的东西,所以我不能这样做

  • 尝试:覆盖 TreeStore 中的插入方法

  • 结果:这些方法位于树存储中的私有子类中,因此我无法直接访问它们

  • 尝试:使修改后的树库类扩展原始版本并隐藏所有内容

  • 结果:编译器会告诉我我需要一个变量前面的@Override 来处理重复类型,当我添加它时,它会告诉我没有什么可以覆盖(x 100)

在这一点上,我什至还可以尝试做些什么。如果有人有任何建议或例子,我将不胜感激。

4

1 回答 1

0

当在两棵树之间拖放东西时,我最终破解了一些有用的东西(对于我的特定用例) - 特定的键实例并不重要,我的只​​是将项目本身的路径作为键的一部分 - 主要部分只是修改 appendModel 以使用插入而不是 addSubTree 单独添加树组件,所以我有一个实际上允许创建实例的数据类型。

如果有人能找到更好的方法,我很乐意看到它。

public class MyTreeDropTarget extends TreeDropTarget<FileSystemKey> {
    public MyTreeDropTarget(Tree<FileSystemKey, ?> tree) {
        super(tree);
    }

    private void InsertClone(FileSystemKey parent,
            TreeStore.TreeNode<FileSystemKey> node, int index) {
        FileSystemKey clone;
        if (parent == null) { //root of the tree
            clone = new FileSystemKey(node.getData());
            clone.SetKey("/", null, "/" + clone.key2);
            getWidget().getStore().insert(index, clone);
        } else { //a child element
            clone = new FileSystemKey(node.getData());
            clone.SetKey(parent.key1 + parent.key2 + "/", null, parent.key1
                + parent.key2);
            getWidget().getStore().insert(parent, index, clone);
        }
        //if this node had children, 
        //we then insert the children as children of this node
        if (node.getChildren().size() > 0) { 
            //TODO: rewrite to preserve order       
            appendModel(clone, node.getChildren(), 0);
        }
    }

    @Override
    protected void appendModel(FileSystemKey p, List<?> items, int index) {
        if (items.size() == 0)
            return;
        if (items.get(0) instanceof TreeStore.TreeNode) {
            // @SuppressWarnings("unchecked")

            List<TreeStore.TreeNode<FileSystemKey>> nodes = (List<TreeStore.TreeNode<FileSystemKey>>) items;

            // TODO: replace clone with gets
            for (TreeStore.TreeNode<FileSystemKey> key : nodes) {
                InsertClone(p, key, index);
            }
        } else {// no changes here - maybe change
                // this if you have non-homogenous key types
            @SuppressWarnings("unchecked")
            List<FileSystemKey> models = (List<FileSystemKey>) items;
            if (p == null) {
                getWidget().getStore().insert(index, models);
            } else {
                getWidget().getStore().insert(p, index, models);
            }
        }
    }
}
于 2016-12-12T23:56:31.540 回答