新秀问题,我没有太多运气。在我的e4 RCP应用程序中,我有几个实例,我在向导中创建一个对象,然后应该出现在我的一个视图中。
所需的行为类似于在创建新项目后eclipse Package Explorer View的更新方式。
我以为我可以从partService中获取视图并运行我自己的更新方法:
MPart ingredientsView = partService.showPart("com.personal.recipes.part.ingredientsview", PartState.ACTIVATE);
IngredientsView iv = (IngredientsView) ingredientsView.getObject();
iv.updateView();
虽然这可以在其他地方使用,但是从向导调用'partService'时为null,而应用NPE则为。
那么在修改内容后强制e4视图更新的被禁止方法是什么?
编辑: 我尝试在他的回答中使用像@ greg-449这样的ContextInjectionFactory,但是我不确定将它放在我的代码中,或者如何定义上下文。我从工具栏按钮启动向导,并将以下代码放在我的处理程序中:
@Execute
public void execute(Shell shell) {
IEclipseContext context = EclipseContextFactory.create();
IWizard ingredientWizard = ContextInjectionFactory.make(IngredientWizard.class, context);
WizardDialog wizardDialog = new WizardDialog(shell, ingredientWizard);
wizardDialog.open();
}
但是,当我尝试使用@Inject EPartService partService获取部件服务时;我得到一个InjectionException,说没有找到错误。
一旦注射可用,使用EventBroker就像是要走的路。
答案 0 :(得分:1)
enter code here
更新视图的最佳方法是使用模型作为视图的内容。您的向导似乎允许编辑或创建成分。当您执行向导的完成时,您可能正在修改一些成分数据。应该告知成分模型这些变化。如果视图使用观察此模型的内容提供程序,则在模型看到更新时将自动更新(这是观察者模式)。
这是如何工作的取决于您的数据的性质。您可以使用Java中的PropertyChange-Support。
为此,让内容提供者在数据更改时实现org.eclipse.jface.util.IPropertyChangeListener
接口并触发属性更改事件。
更新
我的ContentProvider实现了属性更改界面。每当收到属性更改事件时,都会刷新查看器(异步)。我的所有持久性操作都由数据管理器处理,类似于Fowler的表数据网关模式,但有时用于多个表。数据管理器触发属性更改事件。这样UI(向导)不需要知道持久性
答案 1 :(得分:0)
仅在应用程序模型知道的对象上执行注入。因此,除非你手动操作,否则它不能用于向导或对话框。在创建对话框时使用ContextInjectionFactory
:
IWizard wizard = ContextInjectionFactory.make(YourWizardClass.class, eclipseContext);
WizardDialog dialog = new WizardDialog(shell, wizard);
这将对您的向导类进行注入,使您可以访问EPartService
。
你也可以使用'事件经纪人' (IEventBroker
)将事件广播给任何感兴趣的事物,而不是找到您的特定视图。