IDEA使用JFX的相關問題

1 問題概述

首先是javafx找不到對應的類:
在這裏插入圖片描述
其次是java

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

這種問題。
或者是bash

Error: JavaFX runtime components are missing, and are required to run this application

這樣的問題。app

2 解決方案

環境Manjaro+OpenJDK11,首先須要確保有OpenJFX,可是,不能直接使用pacman/yaourt安裝:
在這裏插入圖片描述
雖然看上去沒什麼問題,OpenJDK使用的也是pacman安裝的,想着JFX也能夠這樣,安裝以後在jvm

/usr/lib/jvm/java-11-openjdk/lib

下面確實有了JFX的文件,可是裝了以後IDEA死活識別不出來,沒辦法,只能手動安裝JFX。
手動安裝的OpenJFX一加就立刻識別出來了,因此,手動安裝吧,也不難,戳這裏下載所須要的版本,解壓到對應的位置,而後在IDEA中的外部庫添加其中的lib文件夾便可:
在這裏插入圖片描述
添加以後另外一個問題是ui

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:this

--module-path=JFX_LIB_PATH --add-modules=javafx.controls,javafx.fxml

其中JFX_LIB_PATH是JFX下的lib目錄路徑,可是不行,另外一個方案是在源文件目錄下添加module-info.java:spa

module javafx.graphics{
    exports com.sun.javafx.util
}

也不行,直接報錯,而後又搜索到了另外一個解決辦法,額外添加一個相似啓動類的java文件,好比叫App.java:code

import javafx.application.Application;

public class App {
    public static void main(String[] args) {
        Application.launch(Main.class,args);
    }
}

而後修改IDEA的運行配置,把主類修改成App。
這樣筆者的問題就解決了,能夠正常運行JFX程序了。component

3 其餘問題

Caused by: java.lang.NullPointerException: Location is required.

其中一個可能的辦法是:xml

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>