1

Treeこのチュートリアルに似た JFace でプラグインを作成しました:チュートリアル

また、コマンドを含むメニュー エントリも定義しました。コマンドのハンドラーは、ツリーのモデルを変更して更新する必要があります。しかし、正しいツリー ビュー ( TreeViewer/ ViewPart) を取得する方法と、コマンド ハンドラーからモデルにアクセスする方法がわかりません。誰か助けてくれませんか?

4

1 に答える 1

1

解決策 1 - 独自の API を使用する

アクティブな MPart を Handler に挿入し、part.getObject() を使用してコントリビューション クラスを取得できます。その後、独自の API にアクセスしてモデルと TreeViewer を取得できます。

@Execute
public void executeHandler(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
    MyPart myPart = (MyPart)part.getObject();
    MyModel myModel = myPart.getMyModel();
    TreeViewer viewer = myPart.getMyTreeViewer();
}

解決策 2 - DI を使用する

TreeViewer を初期化するときは、Part の IEclipseContext に配置します。その後、TreeViewer を Handler に挿入できます。

public class MyPart {
    @PostConstruct
    void postConstruct(Composite parent, IEclipseContext context) {
        TreeViewer viewer = new TreeViewer(parent);
        context.set(TreeViewer.class, viewer);
    }
}

public class MyHandler {
    @Execute
    public void executeHandler(TreeViewer viewer) {
    }
}

もちろん、モデルでも同じことができます。モデルのインスタンスが 1 つしかない場合 (MyModel がシングルトンの場合)、パーツのコンテキストではなく、アプリケーションのコンテキストに配置できます。これを行うのに適した場所は、AddOn (または LifeCycleHandler) です。

または、MyModel クラスを @Creatable @Singleton に定義して、オンデマンドで DI によって作成されるようにすることもできます。これは、MyModel に必要なものがすべてコンテキスト内にある場合に便利です。

このような状況での私のお気に入りのソリューションは、ModelService を OSGi サービスとして作成することです。OSGi サービスは、IEclipseContext を介して常に利用できます。

DI の詳細については、Lars Vogel によるこのチュートリアル (18、31、32 章) を参照してください: http://www.vogella.com/articles/EclipseRCP/article.html#dependencyinjectione4 http://www.vogella.com/記事/EclipseRCP/article.html#extentcontext http://www.vogella.com/articles/EclipseRCP/article.html#ownobjects

于 2013-06-19T08:29:59.820 に答える