3

RCP アプリケーションでビューを作成しようとしていますが、ビューにはTreeViewer.

ツリーにはフォルダーまたはリーフを含めることができ、フォルダーにはフォルダーおよびリーフを含めることができます。ルート フォルダーのバックエンド データ モデルにフォルダーを追加すると、UI は自動的に更新されますが、任意のブランチ フォルダーにフォルダーを追加すると、UI は自動的に更新されません。私のコードの何が問題なのか教えてください。

モデルクラス:

public class TreeNode extends BindableObject {

    private Folder parent;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        super.firePropertyChange("name", this.name, this.name = name);
    }

    public Folder getParent() {
        return parent;
    }

    public void setParent(Folder parent) {
        this.parent = parent;
    }

}
public class Folder extends TreeNode {

    private List<TreeNode> children = new ArrayList<TreeNode>();

    public List<TreeNode> getChildren() {
        return children;
    }

    public void setChildren(List<TreeNode> children) {
        this.children = children;
    }

    public void add(TreeNode node){
        children.add(node);
    }

}

景色 :

public class ExplorerView extends ViewPart {

    private WritableList data;
    private TreeViewer treeViewer;

    public WritableList getData() {
        return data;
    }

    public TreeViewer getViewer(){
        return treeViewer;
    }

    public ExplorerView() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout(SWT.HORIZONTAL));
        treeViewer = new TreeViewer(parent, SWT.BORDER);
        treeViewer.setContentProvider(new ObservableListTreeContentProvider(new ExplorerObservableFactory(), new ExploerTreeStructureAdvisor()));
        treeViewer.setLabelProvider(new ExplorerTreeLabelProvider());
        ArrayList<TreeNode> list = new ArrayList<TreeNode>();
        list.add(new ExplorerDataModel().getElements()[0]);
        data = new WritableList(list, TreeNode.class);
        treeViewer.setInput(data);
    }

    @Override
    public void setFocus() {

    }

}

ObservableFactory:

public class ExplorerObservableFactory implements IObservableFactory {

    @Override
    public IObservable createObservable(Object target) {
        System.out.println(target.getClass().getName());
        if(target instanceof WritableList){
            return (WritableList)target;
        }
        else if(target instanceof Folder){
            List<TreeNode> children = ((Folder)target).getChildren();
            return new WritableList(children, TreeNode.class);
        }
        return null;
    }

}

TreeStructureAdvisor:

public class ExploerTreeStructureAdvisor extends TreeStructureAdvisor {

    @Override
    public Object getParent(Object element) {
        return ((TreeNode)element).getParent();
    }

    @Override
    public Boolean hasChildren(Object element) {
        if(element instanceof Folder){
            return true;
        }else{
            return false;
        }
    }



}

データ :

public class ExplorerDataModel {
    public TreeNode[] getElements() {
        Folder f1 = new Folder();
        f1.setName("Database Connections");
        Folder f11 = new Folder();
        f11.setName("Credit Test");
        TreeNode t1 = new TreeNode();
        t1.setName("bank@localhost");
        f11.add(t1);
        t1.setParent(f11);
        TreeNode t2 = new TreeNode();
        t2.setName("credit@localhost");
        f11.add(t2);
        t2.setParent(f11);
        Folder f12 = new Folder();
        f12.setName("Credit Product");
        TreeNode t3 = new TreeNode();
        t3.setName("nbcbcredit@localhost");
        f12.add(t3);
        t3.setParent(f12);
        TreeNode t4 = new TreeNode();
        t4.setName("nbcbcredit_bak@localhost");
        f12.add(t4);
        t4.setParent(f12);
        f1.add(f11);
        f11.setParent(f1);
        f1.add(f12);
        f12.setParent(f1);
        return new TreeNode[] { f1 };
    }
}

テスト コマンド ハンドラ:

public Object execute(ExecutionEvent event) throws ExecutionException {
    ExplorerView v =(ExplorerView) HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().findView("com.amarsoft.dmp.explorer.explorerView");
        Folder f = new Folder();
        f.setName("ODA Flat Files");
        v.getData().add(f);

        Folder f1 = (Folder) v.getData().get(0);
        f1.setName("Database Connections (3)");

        Folder f2 = new Folder();
        f2.setName("Report Test");
        f1.add(f2);

        return null;
    }

上記のコマンドを実行すると、追加されたフォルダー「ODA Flat Files」がツリーにすぐに表示されますが、追加されたフォルダー「Report Test」はそこにありませんTreeViewer#refresh()

4

3 に答える 3

4

モデルを変更しても、ツリーには通知されません。更新は、データが変更され、更新が必要であることをツリーに伝える 1 つの方法です。Eclipse で jface ビューアの Java ドキュメントを調べると、次の引用が見つかります。

構造の変更を処理するには、代わりに更新メソッドを使用してください。

于 2012-06-25T15:23:40.380 に答える
2

データバインディングを誤って設定したようです...

公式のスニペットを見てください:

楽しむ!(更新なしで ;-) )

ps。EMFについては、これを見てください:http://tomsondev.bestsolution.at/2009/06/08/galileo-emf-databinding-%E2%80%93-part-3/

于 2013-03-01T20:35:44.153 に答える
1

あなたのExplorerObservableFactory代わりに

... else if(target instanceof Folder){
            List<TreeNode> children = ((Folder)target).getChildren();
            return new WritableList(children, TreeNode.class);
     }

以下のように

     else if(target instanceof Folder){                
            return BeansObservables.observeList(target, "children");
     }

ここに戻るWritableListと、contentProvider のリスナーが登録されています (代わりに、Folder Bean に登録する必要があります)。

于 2013-04-27T18:32:22.353 に答える