Я использую OpenJDK 11 + среду OpenJavafx 11 в Eclipse Photon 2018-12 и создал один проект GUI плагина в eclipse.Моя цель состоит в том, чтобы добавить компоненты OpenJavafx (Button) к части SWT.
Вот шаги, которые я выполняю для визуализации кнопки javafx поверх части SWT
Представление приложения e4xmi:
Существует два плагина, использующих
1.com.rcp.main - Основное приложение RCP, в главном плагине есть две части в стеке частей.
Часть 1 (Пример Часть 1: класс URI bundleclass: //com.rcp.main/com.rcp.main.parts.SamplePart) Визуализируется с помощью чистого SWT, созданного из шаблона затмения, показанного на рисунке ниже.Он работает как ожидалось.
Часть 2 (Пример Часть 2: класс URI bundleclass: //com.rcp.main/com.rcp.main.parts.SamplePart1)Отображается с открытыми компонентами Javafx GUI (Button) на части SWT.Я получаю пустое одно исключение из рисунка ниже
2.com.rcp.feature - Эта функция включает в себя плагины с com.rcp.main и org.eclipse.fx.osgi
VM Argumentsв файле продукта:
-Dorg.osgi.framework.bundle.parent = ext -Dosgi.framework.extensions = org.eclipse.fx.osgi --module-path "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)