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>