Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Eclipse4RCP中获取IHandlerService对象?_Java_Eclipse Rcp - Fatal编程技术网

Java 如何在Eclipse4RCP中获取IHandlerService对象?

Java 如何在Eclipse4RCP中获取IHandlerService对象?,java,eclipse-rcp,Java,Eclipse Rcp,我正在做一个测试项目,并被跟踪。之后,我对它做了一些更改,例如创建了一个JFaceTreeView。现在我想知道,如果用户双击一个TreeView元素,它会打开另一个部分。我有这个命令,但我不知道怎么称呼它。如果您查看教程,您可能会注意到它只使用部分,而不使用视图,而且我没有启动工作台的Application.java类。因此,以下方法不适用于我: IHandlerService handlerService=(IHandlerService)viewer.getSite().getServic

我正在做一个测试项目,并被跟踪。之后,我对它做了一些更改,例如创建了一个
JFace
TreeView
。现在我想知道,如果用户双击一个
TreeView
元素,它会打开另一个
部分。我有这个命令,但我不知道怎么称呼它。如果您查看教程,您可能会注意到它只使用部分,而不使用视图,而且我没有启动工作台的
Application.java
类。因此,以下方法不适用于我:

  • IHandlerService handlerService=(IHandlerService)viewer.getSite().getService(IHandlerService.class)
  • IWorkbenchWindow=PlatformUI.getWorkbench().getActiveWorkbenchWindow()
    
    IHandlerService handlerService=(IHandlerService)window.getService(IHandlerService.class)
    
    handlerService.executeCommand(cmdID,null)

  • 它们都给我提供了
    NullPointerException

    这个旧的备用怎么样:

    Command command = ((ICommandService)getSite().getService(ICommandService.class)).getCommand(commandId);
    ...
    final Event trigger = new Event();
    ExecutionEvent executionEvent = ((IHandlerService)getSite().getService(IHandlerService.class)).createExecutionEvent(command, trigger);
    command.executeWithChecks(executionEvent);
    

    根据Lars Vogel的说法,推荐的方法是注入如下所示的服务(这对我来说很有效)。唯一的障碍是根据插件规则,包org.eclipse.e4.core.commands似乎无法访问(可能还没有导出)

    但这是可行的:

    import org.eclipse.e4.core.commands.ECommandService;
    import org.eclipse.e4.core.commands.EHandlerService;
    
    public class MyPart{
    public static final String S_CMD_MY_COMMAND_ID = "my.command";
    
    @Inject ECommandService commandService;
    @Inject EHandlerService service;
    
    @PostConstruct
    public void createComposite(Composite parent) {
        parent.setLayout(new GridLayout(2, false));
                ....
        Button btnMyButton = new Button(parent, SWT.NONE);
        btnMyButton.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings({ "restriction" })
            @Override
            public void widgetSelected(SelectionEvent e) {
                try {
                    Command command = commandService.getCommand( S_CMD_MY_COMMAND_ID );
                    if( !command.isDefined() )
                        return;
                    ParameterizedCommand myCommand = commandService.createCommand(S_CMD_MY_COMMAND_ID, null);
                    service.activateHandler(S_CMD_MY_COMMAND_ID, new MyCommandHandler());
                    if( !service.canExecute(myCommand ))
                        return;
                    service.executeHandler( myCommand );
                } catch (Exception ex) {
                    throw new RuntimeException("command with id \"my command id\" not found");
                }           
            }
        });
    
        ....
    }
    
    该处理程序将按如下方式实现(不包括在相应的命令插件扩展中,除非您还希望它实现IDefaultHandler以实现兼容性):

    有关详细信息,请参阅:

    public class MyCommandHandler{
    
    @Execute
    public Object execute() throws ExecutionException {
        System.out.println("Hello");
        return null;
    }
    
    @CanExecute
    public boolean canExecute() {
        return true;
    }
    }