从jar

时间:2017-02-20 12:31:29

标签: javafx resources classloader

在阅读了一堆关于资源系统的帖子之后,我还是碰到了这个帖子。

情景:

我目前正在开发一个javafx应用程序,它既可以作为jar运行,也可以作为Applet运行。 我使用简单的技巧JavaFX into Swing Applications将我的应用程序包装到fxpanel中。

这两个版本在Eclipse中运行良好。

但是现在,一旦第一个fx控制器被调用,jar和Applet都会遇到同样的问题。

我的包结构:

/*
 1. 
    2.
        3.
            controller.
                        EntryPoint.class <-- Main
                        MenuController.class
                        TabsController.class
            ui.
                pane.
                        MainMenu.fxml
                        Startuppane.fxml
                        Tabs.fxml
                note.
                        NoteSearch.fxml
                        NoteView.fxml

 */

//编辑:我解压缩的jar中的Tree命令:Pastebin //编辑结束

我的申请执行以下操作:

首先,它从EntryPoint.class加载RootLayout

MainBorder = ROOTLOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/pane/StartupPane.fxml"));

然后是两个孩子,一个菜单和一些标签。

菜单工作正常,因为MenuController本身不加载任何其他子项。

现在实际问题在调用TabsController时进入,并尝试加载它自己的子项目,例如NoteView。

    TP  = TABSLOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/pane/Tabs.fxml")); //Loading The Tabs.

因此TabPane被加载,当TabsController现在尝试加载他自己的Childitems时。我总是在导出的jar或webapplet中获得NullPointer。

我尝试使用以下方法加载ChildItems:

NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml")); 

在Eclipse中正常工作,但一旦导出就会导致Unknown Path / NullPointer

NOTE_SEARCH_LOADER.load(TabsController.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml")); 

使用ClassLoader,删除第一个Slash。在Eclipse中工作,一旦导出导致Unknown path / NullPointer

NOTE_SEARCH_LOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml"));

将EntryPoint.class(main)与Absolute Path一起使用。一旦导出,就可以在Eclipse中运行。导出时出现未知路径/ NullPointer。

NOTE_SEARCH_LOADER.load(EntryPoint.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml"));

使用我的Main Class中的ClassLoader,删除了第一个Slash。导出时在Eclipse,Unknown Path / NullPointer中工作。

// edit3:我做了另一个测试,将CodeController中的Code复制到了EntryPoint中。即使在导出到Jar或Applet之后,CodePoint版本的代码也能正常工作。

我想它有事情要做,如何调用Controller?

//编辑结束

我在挠头,想知道还有什么可以尝试。

// edit2:当我解压缩我的fxml时,可以在给定位置找到NullPointer导致FXML。

//编辑结束

也许我又错过了一些非常明显的东西。

Sinclery

Fabian95qw

访问过的主题列表:

Get a resource using getResource()

Preferred way of loading resources in Java

URL to load resources from the classpath in Java

How to reference javafx fxml files in resource folder?

How do I use Java getResource() to get a resource from a parent directory?

Why does getResource return null

1 个答案:

答案 0 :(得分:0)

我只是在经过几个小时的尝试之后就采用了简单的方法,只需将FXML放入与需要特定fxml的类相同的文件夹中。

所以我的结构现在看起来像这样:Pastebin

我现在再次使用。

访问资源文件
NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("NoteSearch.fxml"));

现在导出的Jar和Web Applet版本都可用。

真诚的Fabian95qw