1

我正在开发一个带有TreeViewer. 虽然有很多文章解释了如何向查看器添加编辑支持(以及如何在模型中更新视图的更改),但当底层模型发生更改时,我没有找到太多更新 Treeview 的内容。简而言之,我的问题:

TreeView ----> 模型更新 ------ 有很多例子

模型---->树视图更新-----这是我的问题

编辑:这是我尝试过的并且有效。请发表评论

viewer.getTree().addKeyListener(new KeyListener(){

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

        if(e.keyCode==SWT.F3){
            System.out.println("F3 pressed... new element will be added");
            TreeParent root = (TreeParent) viewer.getInput();
            TreeParent activityRoot = (TreeParent) root.getChildren()[0];
            activityRoot.addChild(new TreeObject("NEW_ACTIVITY"));
            //viewer.update(root, null);
            viewer.refresh();
        }

    }

    });
4

2 回答 2

4

数据模型由您提供content providerTreeViewer不提供任何更改此数据的方法 - 您必须自己编写代码。当您更改为模型时,您可以使用以下方法来告知TreeViewer更改:

如果您刚刚更改了树中单个项目需要显示的内容,请使用

TreeViewer.update(object, null);

以更新树中的该项目。还有一个数组版本可以更新多个对象。

如果您在树中添加或删除了对象,请使用

TreeViewer.refresh();

重建整棵树或

TreeViewer.refresh(object);

从 开始刷新树的部分object

告诉树关于添加和删除对象有

TreeViewer.add(parent, object);
TreeViewer.remove(object);

这些也有数组变体。

为了帮助 TreeViewer 找到对象调用

TreeViewer.setUseHashlookup(true);

(必须在之前调用TreeViewer.setInput)。由于这使用哈希表,因此对象应该具有合理的hashCode方法equals。您还可以使用TreeViewer.setComparer指定不同的类来做哈希码和比较。

于 2014-01-18T10:39:19.160 回答
0

根据该线程中的评论,关于使用TreeViewer和少量实验的 Eclipse 角文章之一我创建了一个工作模型。

以下是步骤:

创建如下监听器接口

public interface TreeModelListener extends EventListener {
    public void onDelete(TreeObject obj);
}

让树内容提供者为每个树模型项添加侦听器并实现此接口,如下所示

public class TreeContentProvider implements  IStructuredContentProvider,ITreeContentProvider,TreeModelListener {

TreeViewer tv;
public TreeContentProvider(TreeViewer tv){
    this.tv=tv;
}

int cnt=0;
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
    cnt ++;
    System.out.println("inputChanged() called "+oldInput+" new: "+newInput);
    if(newInput!=null){

        ((TreeParent)newInput).setListener(this);
        TreeObject []items = ((TreeParent)newInput).getChildren(); 
        for(TreeObject obj : items){
            if(obj instanceof TreeParent){
                ((TreeParent) obj).setListener(this);
            }
        }

    }
}

....

@Override
public void onDelete(TreeObject obj) {
    System.out.println("Delete of "+obj+" handled by content handler ");
    TreeParent parent = obj.getParent();
    if(parent.getChildren().length<=1){
        return;
    }
    parent.removeChild(obj);
    this.tv.refresh();
}

}

TreeModel类中添加一个方法,如下所示。显然,TreeParent类应该有一个ArrayList在上面#1 中使用的监听器

public void fireChildDelete(final TreeObject obj){

    if(this.listener!=null){
        new Runnable(){

            @Override
            public void run() {
                System.out.println("New thread spawned with ID "+Thread.currentThread().getId());
                listener.onDelete(obj);
            }

        }.run();
    }
}

最后添加KeyListenerTreeViewerObject 以处理 Delete 键,如下所示:

tv.getTree().addKeyListener(new KeyListener(){

        @Override
        public void keyPressed(KeyEvent e) {

        }

        @Override
        public void keyReleased(KeyEvent e) {

            if(e.keyCode==SWT.F3){
                System.out.println("F3 pressed... new element will be added");
                TreeParent root = (TreeParent) tv.getInput();
                TreeParent activityRoot = (TreeParent) root.getChildren()[0];
                activityRoot.addChild(new TreeObject("NEW_ACTIVITY"));
                //viewer.update(root, null);
                tv.refresh();
            }

            if(e.keyCode==SWT.DEL){


                System.out.println("DEL key pressed... element will be deleted "+((Tree)e.getSource()).getSelection().length);

                if(((Tree)e.getSource()).getSelection().length>0){
                    final IStructuredSelection selection = (IStructuredSelection) tv
                              .getSelection();
                    System.out.println("DEL#2 key pressed... element will be deleted "+selection.getFirstElement().getClass());

                    TreeParent parent =  ((TreeObject)selection.getFirstElement()).getParent();
                    parent.fireChildDelete((TreeObject) selection.getFirstElement());
                    //tv.remove(selection.getFirstElement());
                    //viewer.update(viewer.getInput(),null);
                    //tv.refresh();
                }
            }


        }

    });
于 2014-02-23T08:16:29.640 回答