这段代码在激活/停用命令Eclipse插件开发的IHandlerActivation时有什么问题

时间:2012-04-30 15:08:25

标签: eclipse eclipse-plugin eclipse-rcp jface

所以,我有2个命令,由PLAY_COMMAND_IDSTOP_COMMAND_ID标识。每个命令都有每个处理程序,分别是playHandlerstopHandler(这些是扩展AbstractHandler类)。

这些命令以Button样式提供给我视图的工具栏。基本上我想要的是最初PLAY_COMMAND是活跃的但STOP_COMMAND没有。单击PLAY_COMMAND后,它将激活STOP_COMMAND,然后停用自身(PLAY_COMMAND)。当STOP_COMMAND点击时,反之亦然。

所以我所做的就是这样。起初它工作(我点击播放按钮,然后停止按钮被激活,播放按钮被禁用。我点击停止按钮,然后播放按钮激活,停止按钮被禁用。但是当我点击播放按钮再次,当停止按钮激活时,播放按钮仍然有效)。那么我的代码在这里出了什么问题:

private AbstractHandler playHandler, stopHandler, pauseHandler, stepHandler;
private IHandlerActivation playActivation, stopActivation, pauseActivation, stepActivation;
private void createHandlers(){
  final IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
    playHandler = new AbstractHandler() {

      @Override
      public Object execute(ExecutionEvent event) throws ExecutionException {
        handlerService.deactivateHandler(playActivation);
        if(stopActivation == null){
          stopActivation = handlerService.activateHandler(STOP_COMMAND_ID, stopHandler);
        } else {
          handlerService.activateHandler(stopActivation);
        }
        return null;
      }
    };

    stopHandler = new AbstractHandler() {

      @Override
      public Object execute(ExecutionEvent event) throws ExecutionException {
        handlerService.deactivateHandler(stopActivation);
        handlerService.activateHandler(playActivation);
        return null;
      }
    };  
    playActivation = handlerService.activateHandler(PLAY_COMMAND_ID, playHandler);
  }
}

在我的视图中createHandlers()方法结束时调用createPartControl(Composite parent)方法。

1 个答案:

答案 0 :(得分:0)

好的,所以我发现了。调用IHandlerActivation方法时返回的activateHandler(IHandlerActivation)在停用时不能再次用于激活相同的处理程序。因此,解决方案是尝试调用handlerService.activateHandler(commandID, playHandler)而不是调用handlerService.activateHandler(playActivation)