MagicDraw плагин для браузера с JavaFx

Я пишу плагин Magicdraw с JavaFx Framework, чтобы добавить новый браузер. Ниже приведен код инициализации нового браузера в классе LibraryBrowser.

private static final WindowComponentInfo info = new WindowComponentInfo("test_browser", "Test Browser", null, 
        ProjectWindowsManager.SIDE_WEST, ProjectWindowsManager.STATE_DOCKED, true);
public LibraryBrowser() {
    Browser.addBrowserInitializer(new Browser.BrowserInitializer() {
        @Override
        public void init(@Nonnull Browser browser, @Nonnull Project project) {
            browser.addPanel(new LibraryBrowserView(info)); //add library view
        }
        @Override
        public WindowComponentInfoRegistration getInfo() {
            return new WindowComponentInfoRegistration(info, null);
        }
    });
}

Где LibraryBrowserView - это класс, расширяющий ExtendedPanel, реализующий WindowComponent, как показано в следующем коде.

public class LibraryBrowserView extends ExtendedPanel  implements WindowComponent {
private WindowComponentInfo info;

public LibraryBrowserView(WindowComponentInfo info) {
    //Set WindowComponentInfo
    this.info = info;
    JFXPanel fxPanel = new JFXPanel();
    add(fxPanel);
    fxPanel.setVisible(true);   
    Group  root1  =  new  Group();  
    Scene  scene  =  new  Scene(root1, Color.ALICEBLUE);    
    Text  text  =  new  Text();
    text.setX(40);
    text.setY(100);
    text.setFont(new Font(25));
    text.setText("Test JavaFX!");
    root1.getChildren().add(text);    
    fxPanel.setScene(scene);
}
@Override
public WindowComponentContent getContent() {
    return new BrowserWindowComponentContext(this);
}
@Override
public WindowComponentInfo getInfo() {
    return info;
}}

class BrowserWindowComponentContext implements WindowComponentContent {
private JPanel panel;
public BrowserWindowComponentContext(JPanel panel) {
    this.panel = panel;
}
@Override
public Component getWindowComponent() {
    return panel;
}
@Override
public Component getDefaultFocusComponent() {
    return panel;
}}

Ошибка возникает при открытии MagicDraw.

java.lang.UnsatisfiedLinkError: com.sun.prism.d3d.D3DVertexBuffer.nDrawIndexedQuads(J[F[BI)I

2 ответа

Представители NoMagic только заявляют, что они не работают с JavaFX; они не заявляют, что MagicDraw не совместим с JavaFX. Что хорошо, потому что они были бы неправы, если бы сказали это. Мы создали несколько плагинов MagicDraw, которые используют JavaFX.

Проект Nasa OpenMBEE MDK на github содержит пример того, как это можно сделать. В своем классе плагинов они загружают необходимое расширение.jars и затем вызывают этот метод:

    private void initJavaFX() {
    try {
        Class.forName("javafx.application.Platform");
    } catch (ClassNotFoundException e) {
        System.err.println("[WARNING] JavaFX libraries are unavailable. Please add \"-Dorg.osgi.framework.bundle.parent=ext\" to the \"JAVA_ARGS\" line in your properties file(s) in your MagicDraw bin directory and restart.");
        return;
    }
    new Thread(() -> {
        try {
            Class<?> clazz = Class.forName("gov.nasa.jpl.mbee.mdk.MDKApplication");
            Method method = clazz.getMethod("main", String[].class);
            method.invoke(null, new Object[]{new String[]{}});
        } catch (Exception | Error e) {
            System.err.println("[WARNING] Failed to initialize JavaFX application. JavaFX functionality is disabled.");
            e.printStackTrace();
        }
    }, "JavaFX Init").start();
}

Вот ссылка: https://github.com/Open-MBEE/mdk/blob/develop/src/main/java/gov/nasa/jpl/mbee/mdk/MDKPlugin.java.

Для получения дополнительной информации о том, почему это работает, ознакомьтесь с этой статьей Oracle: интеграция JavaFX в приложения Swing (magicdraw - это приложение Swing, если вы не знали)

Никто из представителей Magic на своем форуме не заявил, что MagicDraw не совместим с JavaFX:

https://community.nomagic.com/post15641.html?hilit=javafx

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