JavaFX MenuBar

时间:2016-08-04 22:32:14

标签: eclipse macos javafx classpath eclipse-classpath

我刚开始一个大的新项目,包含行menuBar = new MenuBar(); MenuBar打包在javafx.scene.control中。没有错误,但是当它在运行时遇到这一行时我得到了

  

线程“AppKit Thread”中的异常java.lang.NoClassDefFoundError:无法初始化类javafx.scene.control.MenuBar

Google建议我的构建路径和运行时路径之间存在差异。我不确定的是如何实际告诉构建路径和运行时路径是什么,尽管我认为我做对了。

构建路径:我转到

Properties -> Java Build Path 

并看到JRE System Library [Java SE 8 [1.8.0_77]]在那里。我进一步确认它包含jfxrt.jar。它还会在构建时检测到没有错误,因此我可以假设它正常工作。

运行时路径:我转到

Run As -> Run Configurations... -> Classpath 

并看到JRE System Library [Java SE 8 [1.8.0_77]]列在Bootstrap条目中。我似乎无法扩展它并确认它包含相关的jar。

  

我是否遗漏了运行时类路径中的任何内容?

编辑:我发现了另一个症状或细微差别。 menuBar = new MenuBar()包含在扩展FX Stage类的对象的构造函数中。单击启动器上的按钮初始化构造函数。当我第一次点击它时,我得到一个Exception in thread "AppKit Thread" java.lang.ExceptionInInitializerError。我第二次点击它是NoClassDefFoundError出现的时候。这有什么意义吗?

编辑2:仍在尝试解决此问题。我可能将它缩小到Style的一个问题。我不知道这意味着什么,但是跟踪可能有所帮助:

Caused by: java.lang.NullPointerException
    at com.sun.javafx.css.StyleManager.getURL(StyleManager.java:867)
    at com.sun.javafx.css.StyleManager.loadStylesheetUnPrivileged(StyleManager.java:1057)
    at com.sun.javafx.css.StyleManager.loadStylesheet(StyleManager.java:917)
    at com.sun.javafx.css.StyleManager._setDefaultUserAgentStylesheet(StyleManager.java:1377)
    at com.sun.javafx.css.StyleManager.setUserAgentStylesheets(StyleManager.java:1209)
    at com.sun.javafx.application.PlatformImpl.lambda$_setPlatformUserAgentStylesheet$182(PlatformImpl.java:698)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl._setPlatformUserAgentStylesheet(PlatformImpl.java:697)
    at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:548)
    at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512)
    at javafx.scene.control.Control.<clinit>(Control.java:87)
    ... 6 more

我不知道如何跟进那些......还有6个,但我可以手动追踪到JFX MenuBar类,在MenuBar构造函数中找到它:getStyleClass().setAll(DEFAULT_STYLE_CLASS);似乎是一个很好的候选者这种情况正在发生。我不确定如何继续,因为这是在.class文件本身。希望这会有所帮助。

编辑3:我得到了建议,只需创建一个新工作区,从SVN查看项目,然后重新开始。想到的可能是某种程度上工作空间被破坏了。没有改变;出现了完全相同的错误。我在这里没有想法。

编辑4:(感谢格式化,鼬!)这是我可以展示的,模糊的:

package _______;

import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;

import ____.FooMenu;
import ____.FooMenuItem;
import ____.FooUtil;
import ____.FooVBox;
import ____.FooStates;

public class FooStageWithMenu extends FooStage
{
    private MenuBar menuBar;
    private FooMenu fileMenu;
    private FooVBox root;

    public FooStageWithMenu(FooStates setting, Image icon)
    {
        super();
        set(setting, icon);
        root = new FooVBox();

        menuBar = new MenuBar(); //This line is where it fails
        root.addNode(menuBar);
        /*...*/
    }
    /*...*/
}

其他一些想法:

  • 我正在开发OSX,我在项目上与之交谈的每个人都在使用Windows。可能是这个问题的操作系统特定来源吗?
  • 我们想要消除库问题的可能性,所以我安装了最新版本,现在运行JDK 1.8.0_102,问题仍然存在。
  • 即使在最近的JDK中,我们各自图书馆的jfxrt.jar之间是否存在一些差异?
  • 特定错误的性质(参见上面的编辑2)。似乎尝试通过检索URL来访问样式表,但它无法访问该样式表,或者无法获取URL或其他内容。关于NullPointerException的任何内容似乎都没有帮助我缩小范围。我确实探索了我的jfxrt.jar并发现在JavaFX类似乎正在搜索的路径中,.css文件确实存在并且看起来完整且没有损坏。

编辑5 :所以我很确定没人在读这个,但我做了只是找到一个很大的线索,与这个版本和之前版本之间的差异有关。我认为我不需要了解具体细节,但是通过在启动器类中注释掉一行来“解决”这个问题。我们有两个启动器类,其中一个扩展另一个。扩展类的构造函数只是super(); new JFXPanel();如果我注释掉第二行,它的工作没有任何明显的问题。这可能是在Mac上破坏它的行,而它在Windows中运行良好。我不知道这意味着什么,我不知道为什么我分享的原始故障是由此引起的。但是这个改变只是在一个测试分支中进行的,所以考虑到临时和有限的性质,我们可能没有必要给这个问题一个正确的解决方案。我只是想分享这个更新,以防它帮助其他任何人。

0 个答案:

没有答案