我创建了一个Tree
类似于本教程的带有 JFace 的插件:教程
而且我还定义了一个带有命令的菜单项。命令的处理程序应该更改树的模型并更新它。但我不知道如何获得正确的树视图 ( TreeViewer
/ ViewPart
) 以及如何从命令处理程序中访问模型。有人可以帮忙吗?
我创建了一个Tree
类似于本教程的带有 JFace 的插件:教程
而且我还定义了一个带有命令的菜单项。命令的处理程序应该更改树的模型并更新它。但我不知道如何获得正确的树视图 ( TreeViewer
/ ViewPart
) 以及如何从命令处理程序中访问模型。有人可以帮忙吗?
解决方案 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