2

我正在用 JavaFx 框架编写一个 Magicdraw 插件来添加一个新的浏览器。以下是 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
4

1 回答 1

1

NoMagic 代表只声明他们不使用 JavaFX。他们没有说明 MagicDraw 与 JavaFX 不兼容。这很好,因为如果他们这么说,他们就错了。我们创建了许多使用 JavaFX 的 MagicDraw 插件。

Nasa 在 github 上的 OpenMBEE MDK 项目包含一个如何做到这一点的示例。在他们的插件类中,他们加载所需的扩展 .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 应用程序)

于 2018-09-05T19:49:03.033 回答