You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RCP e4实现Details视图随A/B视图切换同步显示选中项详情

解决方案

1. 监听视图激活事件,主动推送选中状态

在Details视图或全局事件处理器中监听视图激活事件,当视图A/B被激活时,主动获取该视图的当前选中项并刷新Details视图。

具体实现:

  • 通过注解注入事件监听,捕获UIEvents.UIElement.TOPIC_ACTIVATED事件:
    @Inject
    @Optional
    public void onPartActivated(@UIEventTopic(UIEvents.UIElement.TOPIC_ACTIVATED) Event event) {
      MPart activatedPart = (MPart) event.getProperty(UIEvents.EventTags.ELEMENT);
      String partId = activatedPart.getElementId();
      
      if ("your.viewA.id".equals(partId) || "your.viewB.id".equals(partId)) {
        // 假设视图A/B实现了统一接口,提供获取选中项的方法
        ISelectableView selectableView = (ISelectableView) activatedPart.getObject();
        Object selectedItem = selectableView.getSelectedItem();
        
        if (selectedItem != null) {
          updateDetailsContent(selectedItem); // 刷新Details视图内容的方法
        }
      }
    }
    
  • 让视图A/B实现ISelectableView接口,统一暴露getSelectedItem()方法,避免类型强转的冗余代码。

2. 重写视图焦点方法,主动更新选择服务

利用e4的ESelectionService,在视图A/B获得焦点(激活)时,主动推送当前选中项到选择服务,让Details视图的选择监听触发更新。

具体实现:

  • 在视图A/B中重写setFocus()方法:
    @Override
    public void setFocus() {
      ESelectionService selectionService = getSite().getSelectionService();
      selectionService.setSelection(getSelectedItem());
    }
    
  • Details视图保持原有选择监听逻辑即可:
    @Inject
    @Optional
    public void onSelectionChanged(@Named(IServiceConstants.SELECTION) Object selection) {
      if (selection != null) {
        renderDetails(selection);
      }
    }
    

3. 自定义选择上下文,绑定视图激活状态

如果依赖e4的上下文机制,可以给视图A/B绑定独立的选择上下文,当视图激活时切换上下文,让Details视图自动感知当前激活视图的选中项。

具体实现:

  • 在视图A/B的初始化代码中,注册自己的选择上下文:
    @Inject
    public void init(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell, MPart part) {
      IEclipseContext context = part.getContext();
      context.set(ISelectionService.class, new CustomSelectionService(this));
    }
    
  • 自定义CustomSelectionService继承默认实现,确保视图激活时上下文自动切换,Details视图通过@Named(IServiceConstants.SELECTION)监听即可。

注意事项

  • 处理视图激活时无选中项的场景,避免Details视图显示空内容引发异常。
  • 若使用IEventBroker.subscribe手动订阅事件,需在@PreDestroy方法中取消订阅,防止内存泄漏。

内容的提问来源于stack exchange,提问作者OlliS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:47:09