在阅读了一大堆关于资源系统的帖子后,我仍然对这篇文章感到不快。
场景:
我目前正在开发一个javafx应用程序,它应该既可以作为jar运行,也可以作为Applet运行。我正在使用简单的技巧JavaFX into Swing Applications将我的应用程序包装到一个fxpanel中。
这两个版本在Eclipse中都工作得很好。
但是现在,一旦第一个fx控制器被调用,jar和小程序都会遇到同样的问题。
我的包结构:
/*
1.
2.
3.
controller.
EntryPoint.class <-- Main
MenuController.class
TabsController.class
ui.
pane.
MainMenu.fxml
Startuppane.fxml
Tabs.fxml
note.
NoteSearch.fxml
NoteView.fxml
*/
//edit:来自我解压的jar的树命令:Pastebin //edit End
我的应用程序执行以下操作:
首先,它从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现在尝试加载他自己的子项时。我总是在导出的jar或webapplet中得到一个NullPointer。
我尝试使用以下方法加载ChildItems:
NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml"));
在Eclipse中运行良好,但导出后会导致未知的路径/ NullPointer
NOTE_SEARCH_LOADER.load(TabsController.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml"));
改为使用ClassLoader,删除了第一个斜杠。在Eclipse中工作,一旦导出就会导致未知的路径/ NullPointer
NOTE_SEARCH_LOADER.load(EntryPoint.class.getResourceAsStream("/1/2/3/ui/note/NoteSearch.fxml"));
使用具有绝对路径的EntryPoint.class (main)。导出后即可在Eclipse中工作。导出时未知路径/ NullPointer。
NOTE_SEARCH_LOADER.load(EntryPoint.class.getClassLoader().getResourceAsStream("1/2/3/ui/note/NoteSearch.fxml"));
使用我的主类中的ClassLoader,删除了第一个斜杠。在Eclipse中工作,导出时未知路径/ NullPointer。
//edit3:我做了另一个测试,将代码从TabController复制到EntryPoint中。即使在Export to a Jar or Applet之后,代码的EntryPoint版本仍然有效。
我猜这与控制器是如何被调用有关的?
//编辑结束
我在挠头,想知道我还能尝试什么。
//edit2:当我解压我的fxml时,可以在给定的位置找到导致FXML的NullPointer。
//编辑结束
也许我又遗漏了一些非常明显的东西。
辛克里
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?
发布于 2017-02-21 07:05:35
经过几个小时的尝试,我选择了一条简单的路线,只需将fxml放入需要特定FXML的类所在的文件夹中。
所以我的结构现在看起来是这样的:Pastebin
现在,我再次使用。
NOTE_SEARCH_LOADER.load(TabsController.class.getResourceAsStream("NoteSearch.fxml"));
现在,导出的Jar和Web Applet版本都可以工作。
Sincerly Fabian95qw
https://stackoverflow.com/questions/42344698
复制