Eclipse4 RCP 指南

更多关于 commands 和 handlers

传递参数到 commands

你也可以传递参数到 commands,选择一个 command,然后在参数下点击[添加]按钮。

ID 是你用来获取通过@Named注解注入的参数值的标识,

在你的 HandledMenuItem 或 HandledToolItem 中,添加一个参数,然后将来自 Name 字段定义的 command 参数放进去。Value 字段传递给 command 的 handler。

警告,参数的 ID 是重要的,ID 必须通过 @Named 注解来注入,并且在定义菜单或工具条时用作 Name(第二个字段)。这在下面的图中高亮显示:

为了得到注入到你的 handler 类中的参数,你通过 @Named 注解指定参数的 ID,这通过下面的代码演示:

package com.example.e4.rcp.todo.handlers;

import java.util.List;

import javax.inject.Named;

import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;

// switcher perspectives based on a command parameter 
public class PerspectiveSwitchHandler {

  @Execute
  public void switchPerspective(MWindow window, 
      EPartService partService,
      EModelService modelService,
      @Named("perspective_parameter") String perspectiveId) {
    // use parameter to find perspectives
    List<MPerspective> perspectives = modelService.findElements(window,
        perspectiveId, MPerspective.class, null);

    // switch to perspective with the ID if found
    if (!perspectives.isEmpty()) {
      partService.switchPerspective(perspectives.get(0));
    }
  }
}

提示:除了注入每个参数,你也可以注入 ParameterizedCommand command,然后通过 API 来访问参数。

package com.example.e4.rcp.todo.handlers;

import javax.inject.Named;

import org.eclipse.e4.core.di.annotations.Execute;

public class TestHandlerWithCommandInjected {
  private String parametername = "com.example.e4.rcp.todo" + 
      ".commandparameter.input";
  @Execute
  public void execute(ParameterizedCommand command) {
    Object queryId = command.getParameterMap().get(parametername);
    // more...
  }
}