E4 RCP + GEF5 应用实施

E4 RCP + GEF5 application implementation

我想构建基于 GEF5 的句子可视化工具,其界面将包含 2 个部分:

  1. 输入部分 - 您可以在其中放置句子,
  2. 输出部分,将显示 GEF5 图

组织这些部分的最简单方法是使用 E4 RCP,因为它们可以有单独的 javafx..Panes

这是交易,E4 RCP 使用部件作为分隔的 javafx..BorderPanes

public class DictionaryPart {
    @PostConstruct
    void initUI(BorderPane pane) {
        try {
            TextArea textbox = new TextArea();
            pane.setCenter(textbox);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

但是,GEF5 示例包括使用 javafx..Stage 和 IViewer 界面实现的简单应用程序。

public void start(final Stage primaryStage) throws Exception {
        // create graph
        graph = createGraph();

        // configure application
        Injector injector = Guice.createInjector(createModule());
        domain = injector.getInstance(IDomain.class);
        viewer = domain.getAdapter(
                AdapterKey.get(IViewer.class, IDomain.CONTENT_VIEWER_ROLE));
        primaryStage.setScene(createScene(viewer));

        primaryStage.setResizable(true);
        primaryStage.setWidth(getStageWidth());
        primaryStage.setHeight(getStageHeight());
        primaryStage.setTitle(title);
        primaryStage.show();

        // activate domain only after viewers have been hooked
        domain.activate();

        // set contents in the JavaFX application thread because it alters the
        // scene graph
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                viewer.getContents().setAll(Collections.singletonList(graph));
            }
        });
    }

    protected Scene createScene(IViewer viewer) {
        return new Scene(((IViewer) viewer).getCanvas());
    }

我的第二个 class 描述部分的代码在我的应用程序前面调出舞台,当我只需要一个窗格时。

我只是不明白如何正确地将 GEF5 实施到 E4?除 GEF 文档外,是否有任何教程?

UPD:找到了一个将 GEF4 MVC Logo 示例转换为 e4 RCP 应用程序的示例,但它已过时。

强迫它这样工作:

@PostConstruct
void initUIPane(BorderPane pane){
    graph = createGraph();
    // configure application
    Injector injector = Guice.createInjector(createModule());
    domain = injector.getInstance(IDomain.class);
    viewer = domain.getAdapter(AdapterKey.get(IViewer.class, IDomain.CONTENT_VIEWER_ROLE));
    InfiniteCanvas canvas = (InfiniteCanvas)viewer.getCanvas();
    pane.setCenter(canvas);
    canvas.sceneProperty().addListener((observable, oldValue, newValue) -> {
      if (canvas.getScene() != null) {
        domain.activate();
        try {
            viewer.getContents().setAll(Collections.singletonList(graph));
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
}