IDEA使用JavaFX的相关问题解决方案
1 问题概述
首先是javafx
找不到对应的类:
其次是
class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x50f36265) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics)
because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x50f36265
这种问题。
或者是
Error: JavaFX runtime components are missing, and are required to run this application
这样的问题。
2 解决方案
环境Manjaro
+OpenJDK11
,首先需要确保有OpenJFX
,但是,不能直接使用pacman/yaourt
安装:
虽然看上去没什么问题,OpenJDK
使用的也是pacman
安装的,想着JFX
也可以这样,安装之后在
/usr/lib/jvm/java-11-openjdk/lib
下面确实有了JFX
的文件,但是装了之后IDEA死活识别不出来,没办法,只能手动安装JFX
。
手动安装的OpenJFX
一加就马上识别出来了,所以,手动安装吧,也不难,从此处下载所需要的版本,解压到对应的位置,然后在IDEA中的外部库添加其中的lib
文件夹即可:
添加之后另一个问题是
class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x50f36265) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics)
because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x50f36265
给出的最多的答案是修改VM Options
:
--module-path=JFX_LIB_PATH --add-modules=javafx.controls,javafx.fxml
其中JFX_LIB_PATH
是JFX
下的lib
目录路径,但是不行,另一个方案是在源文件目录下添加module-info.java
:
module javafx.graphics{
exports com.sun.javafx.util
}
也不行,直接报错,然后又搜索到了另一个解决办法,额外添加一个类似启动类的java
文件,比如叫App.java
:
import javafx.application.Application;
public class App {
public static void main(String[] args) {
Application.launch(Main.class,args);
}
}
然后修改IDEA的运行配置,把主类修改为App
。
这样笔者的问题就解决了,可以正常运行JFX
程序了。
3 其他问题
Caused by: java.lang.NullPointerException: Location is required.
其中一个可能的办法是:
Parent root = FXMLLoader.load(getClass().getResource("xxx.fxml"));
改为:
Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("xxx.fxml"));
笔者试过,这个方法不行,另一个解决的方法是,修改pom.xml
:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.fxml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
其中include
中的两个星号指的是fxml
的文件夹的位置。
笔者试过这个方法可行,若fxml
文件在源码根目录,可以修改为:
<include>*.fxml</include>