今天写了个JavaFX应用。结果在FXMLoader的load方法时报错了。报错信息大概是这样的
再看一眼代码。报错的地方正是loader.load
这里的代码写在了Gui类中。而start.fxml与Gui类处于同一包下。按理来说不应该有问题。于是我检查了IDEA的构建生成
原来如此。IDEA根本没给你生成start.fxml。导致在load的时候找不到fxml文件。进而报错。由于FXMLLoader的构造器参数是个URL,因此在报错时并不会指出找不到fxml文件。这里实际上传进去的参数为null。因为Gui.class.getResource返回的URL为null(虚拟机找不到fxml文件)。
那么,解决问题的方法非常简单。首先我们要知道为什么IDEA没有给你在target里生成fxml文件。这是因为在项目里,我把fxml文件放在了src目录下,而不是resources资源目录下。而IDEA判断这个文件是否属于资源文件只看它在不在resources资源目录下,如果不在,不好意思,IDEA会把这个后缀非.java的文件当作废纸。这就是为啥target里没有fxml文件。那么,只要把fxml文件移动到resources资源根下就好了。
这里又有一个坑。请注意,如果你只是单纯新建了一个目录并把它重命名为resources是p用没有的。那么该怎么做呢?首先,找一块“风水宝地”用来存放你的resources目录。比如我想把这个resources目录直接放到项目目录下,这是可以的。但是有几个地方你不能放。比如项目以外以及项目代码目录内等等。OK,假设你准备把resources放在项目目录下,好,接下来,右键你的项目目录
可以看到它弹出来了一个窗口,接下来,依次选择New(新建),Directory(目录),如下图所示
接着,点击Directory(目录),输入resources
回车 ,可以看到在项目根目录下生成了一个目录resources,以后这里就是你存放应用资源的地方了。
接着,右键你的resources,往下找,找到Mark Directory as(将目录标记为),找到Resources Root(资源根),如下图所示
当你发现这个resources目录的图标变得不一样了之后,就说明你成功了
接下来,你只需要将fxml文件移动到resources里面,再次编译运行,就OK了。
觉得有用就点个赞吧,嘿嘿。