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 注入到您的处理程序中。

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

当然,您可以对模型做同样的事情。如果模型只有一个实例(如果 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 回答