Как добавить компоненты OpenJavafx 11 GUI на часть SWT, используя OpenJDK 11 и Eclipse photon 2018-12

Я использую среду OpenJDK 11 + OpenJavafx 11 в Eclipse Photon 2018-12 и создал один проект GUI плагина в eclipse. Моя цель состоит в том, чтобы добавить компоненты OpenJavafx (Button) в SWT Part.

Вот шаги, которые я выполняю, чтобы визуализировать кнопку javafx поверх части SWT

Приложение e4xmi view:

Application.e4xmi

Есть два плагина, использующих

1. com.rcp.main - Основное приложение RCP, в главном плагине есть две части в стеке частей.

Часть 1 (Пример Часть 1: класс URI) bundleclass: //com.rcp.main/com.rcp.main.parts.SamplePart) Отрисовывается с помощью чистого SWT, созданного из шаблона затмения, показанного на рисунке ниже. Это работает, как ожидалось.

часть 1 Скриншот

Часть 2 (Образец Часть 2: класс URI bundleclass://com.rcp.main/com.rcp.main.parts.SamplePart1) Отрисовано с открытыми компонентами Javafx GUI (Button) на части SWT. Я получаю пустое исключение из рисунка ниже

Часть 2 Скриншот

2. com.rcp.feature - эта функция включает в себя плагины с com.rcp.main и org.eclipse.fx.osgi

Аргументы VM в файле продукта:

-Dorg.osgi.framework.bundle.parent = ext -Dosgi.framework.extensions = org.eclipse.fx.osgi - путь к модулю "C:\Program Files\Java\javafx-sdk-11.0.1\lib" --add-modules javafx.base,javafx.controls,javafx.graphics --add-modules ALL-MODULE-PATH

public class SamplePart {

    private TableViewer tableViewer;

    @Inject
    private MPart part;

    @PostConstruct
    public void createComposite(Composite parent) {
        parent.setLayout(new GridLayout(1, false));

        Text txtInput = new Text(parent, SWT.BORDER);
        txtInput.setMessage("Enter text to mark part as dirty");
        txtInput.addModifyListener(e -> part.setDirty(true));
        txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        tableViewer = new TableViewer(parent);

        tableViewer.setContentProvider(ArrayContentProvider.getInstance());
        tableViewer.setInput(createInitialDataModel());
        tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
    }

    @Focus
    public void setFocus() {
        tableViewer.getTable().setFocus();
    }

    @Persist
    public void save() {
        part.setDirty(false);
    }

    private List<String> createInitialDataModel() {
        return Arrays.asList("Sample item 1", "Sample item 2", "Sample item 3", "Sample item 4", "Sample item 5");
    }
}




public class SamplePart1 {
    @Inject
    private MPart part;

    @PostConstruct
    public void createComposite(Composite parent) {
        final FXCanvas fxCanvas = new FXCanvas(parent, SWT.NONE);
        fxCanvas.setLayout(new GridLayout(1, true));
        try {
            Button btn = new Button();
            btn.setText("Say 'Hello World'");
            StackPane root = new StackPane();
            root.getChildren().add(btn);
            Scene scene = new Scene(root);
            fxCanvas.setScene(scene);
        } catch (Exception e1) {

        }
    }

    @PreDestroy
    @Inject
    private void disposeARView(MWindow window, EModelService modelService) {

    }

    @Focus
    public void setFocus() {

    }

    @Persist
    public void save() {

    }
}

Я получаю это исключение, когда нажимаю вкладку Часть 2 в стеке деталей.

Результат:

Пустой экран в части 2

!ENTRY org.eclipse.e4.ui.workbench 4 0 2019-02-05 09:55:46.956
!MESSAGE Unable to create class 'com.rcp.main.parts.SamplePart1' from bundle '82'
!STACK 0

org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Canvas

Caused by: java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Canvas
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1095)

Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Canvas
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

0 ответов

Другие вопросы по тегам