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

RCP E4应用@CanExecute注解不生效导致发货按钮无法正常禁用问题

问题原因
  • E4框架的UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC事件仅支持传入参数为UIEvents.ALL_ELEMENT_ID时,才会触发全局所有@CanExecute方法的返回值同步到UI按钮状态。你代码中传入自定义布尔值check属于无效参数,框架不会识别并更新按钮状态。
  • 你在@CanExecute方法上额外添加的@UIEventTopic注解,仅会让该方法被事件总线触发执行,但这个执行结果不会被E4框架用于更新按钮的启用状态,E4仅会在自身的命令状态更新生命周期中调用@CanExecute方法并读取返回值同步UI。
  • @CanExecute方法不应该依赖事件传参获取状态,正确逻辑是方法执行时主动从上下文中读取最新的选中状态判断,避免状态和UI不同步。
解决方法

1. 修改视图层事件触发逻辑

将事件发布的参数改为UIEvents.ALL_ELEMENT_ID,通知框架全局刷新所有命令的启用状态:

if (selection.getFirstElement() instanceof Package) {
    // 不需要传自定义参数,用ALL_ELEMENT_ID触发全局状态更新
    broker.post(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID);
}

2. 重写ShipmentHandler的canExecute方法

移除@UIEventTopic注解,直接注入上下文的选中对象判断状态:

public class ShipmentHandler {
    @Execute
    public void execute(Shell shell) {
        //TODO
    }
    
    @CanExecute
    public boolean canExecute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection) {
        // 直接从上下文获取当前选中项判断状态
        if (selection instanceof Package pkg) {
            return pkg.isReadyToShip();
        }
        // 未选中有效Package时默认禁用按钮
        return false;
    }
}

也可以注入ESelectionService获取选中状态,效果一致。

修改后触发选择事件时,框架会主动调用canExecute方法获取最新返回值,同步更新发货按钮的启用状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:48:02