当前位置: 首页 > 知识库问答 >
问题:

Eclipse RCP 4在IEventBroker handleEvent中添加了新的选项卡/部件

龚伯寅
2023-03-14

在普通的命令处理程序中,我可以添加新的选项卡/部分,如下代码所示:

@Execute
    public void execute(Shell shell, EPartService partService, MApplication application,EModelService modelService) throws URISyntaxException{
        MPart part = MBasicFactory.INSTANCE.createPart();
        part.setLabel("New file ");
        part.setCloseable(true);
        part.setContributionURI("bundleclass://com.xxx.rcp.app.item_editor/com.xxx.rcp.app.item_editor.parts.ItemEditorPart");
        List<MPartStack> stacks = modelService.findElements(application, "com.xxx.rcp.app.partstack.2", MPartStack.class, null);
        stacks.get(0).getChildren().add(part);
        partService.showPart(part, PartState.ACTIVATE);
    }

现在我想在一个IEventBroker handleEvent中添加新的选项卡/部件。

首先,我在Activator中注册主题:

@Override
    public void start(BundleContext context) throws Exception {
        IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(context);
        IEventBroker eventBroker = serviceContext.get(IEventBroker.class); 
        eventBroker.subscribe("MY_TOPIC", ContextInjectionFactory.make(OpenItemEditorHandler2.class, serviceContext));
}

然后,我在handleEvent中添加选项卡/部件:

public class OpenItemEditorHandler2 implements EventHandler {

//  @Inject 
//  private IEclipseContext serviceContext;

//  @Inject
//  EPartService partService;

//  @Inject
//  MApplication application;

    @Inject
    IEclipseContext serviceContext;

//  @Inject
//  EModelService modelService;

//  @Inject
//  private ECommandService commandService;
//  
//  @Inject
//  private EHandlerService handlerService;

@Override
    public void handleEvent(Event event) {
MPart part = MBasicFactory.INSTANCE.createPart();
        part.setLabel("New file ");
        part.setCloseable(true);
        part.setContributionURI("bundleclass://com.xxx.rcp.app.item_editor/com.xxx.rcp.app.item_editor.parts.ItemEditorPart");
        // get the part stack and show created part 
        EModelService modelService = serviceContext.get(EModelService.class); 
        MApplication application = serviceContext.get(MApplication.class);
        List<MPartStack> stacks = modelService.findElements(application, "com.xxx.rcp.app.partstack.2", MPartStack.class, null);
}

由于null all,我无法访问或注入这些服务。为什么?我已经在激活器中注入了我的对象OpenItemEditorHandler2。

或者你能给一些关于添加新标签/零件的其他解决方案的提示吗?

非常感谢你!

共有1个答案

汪典
2023-03-14

Eclipse ContextFactory.getServiceContext返回的上下文只有OSGi服务,它不包含大多数正常的e4服务,因此您不能使用它来创建您的类。这意味着激活器不是设置订阅的合适位置。

您需要在可以访问适当eclipse上下文的地方设置订阅。附加组件或RCP生命周期可能是合适的。

AddOn构造函数中,您可能有:

@Inject
public MyAddon(IEclipseContext context, IEventBroker eventBroker)
{
  eventBroker.subscribe("MY_TOPIC", ContextInjectionFactory.make(OpenItemEditorHandler2.class, context));
}
 类似资料:
  • 页边距在它们之间的选项卡和选定的选项卡上有一个勾号

  • 我需要的TabLayout有一个“x”的标签数量,这可以根据用户的数据,已经在数据库中有所不同 My xml: 我的代码:

  • 我有一个简单的应用程序,将加载托管的网页,我想显示在单独的选项卡面板。最干净的方法是什么?选项卡可以在用户点击每个选项卡时加载,或者在应用程序启动时一次加载所有选项卡。Sencha Touch没有办法简单地使html: value成为一个URL。我可以为每个选项卡添加一些页面加载事件吗? [更新] 我添加了使用本地html文件进行测试的初始化:方法中的Ajax调用的建议。但是,所有选项卡都显示要完

  • 我尝试在选项卡打开事件上使用以下侦听器:

  • 我想编写一个Android Studio IDE插件,它将在XML文件编辑器视图中添加第三个选项卡(在“设计”和“文本”选项卡之后)。 我试图完成的是对布局XML文件进行不同的表示。 我试着翻阅这一页下面的文件,但找不到任何有用的东西。 有人能帮我吗? 我已经完成了IntelliJ插件的创建过程。但由于我正在Android的插件之上构建一个插件,所以我找不到任何好的起点。如果有人能给我指出XML布

  • 问题内容: 我有来自第三方开发人员的JavaScript文件。它具有一个具有链接的链接,该链接将当前页面替换为目标页面。我想在新标签页中打开此页面。 这是我到目前为止所拥有的: 谁能帮我吗? 问题答案: