0

特定のコマンドに (新しいパーツを作成するための) ハンドラーが割り当てられています。これは以下のように定義され、正常に動作しています。
Handler クラス:

..
@Execute
public void execute(EPartService partService,MApplication application,EModelService modelService) {
    MPart part = MBasicFactory.INSTANCE.createPart();
    part.setLabel("New Part");
    part.setContributionURI("platform:/plugin/com.my.First.app/src/com/my/first/Parts/EditorPart/EmptyPart");
    List<MPartStack> stacks = modelService.findElements(application, null,  MPartStack.class, null);
    stacks.get(2).getChildren().add(part);
    partService.showPart(part, PartState.ACTIVATE);
}

@Execute
public void execute() {
    //This Hello is getting printed.
    System.out.println("Hello ");
}     

Fxml オブジェクト (treeView のクリック イベント) を制御するコントローラー クラスが 1 つあります。そのコマンドをイベント ハンドラのツリービューから手動で実行したい。
コントローラ クラス:

@Inject
org.eclipse.e4.core.commands.ECommandService commandService;
@Inject
org.eclipse.e4.core.commands.EHandlerService service;
..
..

locationTreeView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            if (mouseEvent.getClickCount() == 2 && mouseEvent.getButton().equals(MouseButton.PRIMARY)
                    && locationTreeView.getSelectionModel().getSelectedItem().isLeaf()) {
                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 ShowImmobilizerPart());
                    if (!service.canExecute(myCommand))
                        return;
                    service.executeHandler(myCommand);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

            }
        }
    });  

ここでは、Injected CommandService が null なので、ハンドラ クラスのこのパラメトリック実行メソッドを実行できません。
別のCommandService ( org.eclipse.fx.core.command.CommandService )e(fx)clipseがあると思いますが、それもヌルになります。私はそれを以下の
Controller Class として使用しています:

@Inject org.eclipse.fx.core.command.CommandService commandService;
..
..
if (commandService.exists(S_CMD_MY_COMMAND_ID) && commandService.canExecute(S_CMD_MY_COMMAND_ID, null)) {
    commandService.execute(S_CMD_MY_COMMAND_ID, null);
}

[編集] :
私の目的は、Partstack で新しいパーツを開くことです。したがって、最初のコード スニペットでは、execute(..) でどのようにパーツを開いているかを確認できます。ここで、 or を使用して partService 、 application 、および modelService を取得する方法はありますContextInjectionFactoryIEclipseContext?
コントローラ クラス:

MyHandler myHandler = new MyHandler();
ContextInjectionFactory.inject(myHandler, iEclipseContext);
//myHandler.execute();  This is woroking if i define execute() method in handler Class.
myHandler.execute(partService,application,modelService); // This is not working as i am injecting this arguments at top of class. 
4

1 に答える 1

1

e4xmi ファイルの記述から Eclipse によって作成されたクラスのみが注入されます。

他の方法でクラスを作成した場合は、次を使用してインジェクションを実行できます。

ContextInjectionFactory.inject(object, context);

whereobjectは注入されるクラス インスタンスで、contextIEclipseContext使用されます。これはコンストラクターを注入しないことに注意してください。

ContextInjectionFactory.makeインジェクションを使用してクラスを作成するために使用することもできます。

于 2015-12-01T13:23:53.230 に答える