簡體   English   中英

為什么在加載我的 FXML 文件時收到 javafx.fxml.LoadException?

[英]Why am I receiving a javafx.fxml.LoadException when loading my FXML file?

我正在使用 Java JDK 13 和 FontAwesomeFX 11。

我有一個 FXML 文件,其中包含一些 FontAwesomeIconViews,但是當將文件加載到我的 controller 時,我得到了 javafx.fxml.LoadException。 這是 FXML 文件的樣子:

<?xml version="1.0" encoding="UTF-8"?>

<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<VBox id="window" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <BorderPane id="upper" fx:id="upper" prefHeight="50.0" prefWidth="800.0" stylesheets="@style.css">
         <left>
            <Label text="TEXT" BorderPane.alignment="CENTER">
               <font>
                  <Font size="20.0" />
               </font>
            </Label>
         </left>
         <right>
            <HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
               <children>
LINE 27           <FontAwesomeIconView glyphName="WINDOW_MINIMIZE" size="20" />
                  <FontAwesomeIconView glyphName="CLOSE" size="30" />
               </children></HBox>
         </right>
      </BorderPane>
      <AnchorPane id="body" prefHeight="554.0" prefWidth="800.0">
         <children>
            <TextField layoutX="326.0" layoutY="233.0" promptText="Usuario" />


<PasswordField layoutX="326.0" layoutY="276.0" promptText="Contraseña" />
        <Button layoutX="353.0" layoutY="334.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="94.0" text="Acceder" />
        <Label layoutX="326.0" layoutY="372.0" text="¿Ha olvidado la contraseña?" />
        <FontAwesomeIconView glyphName="USER_CIRCLE" layoutX="350.0" layoutY="185.0" size="100" />
     </children>
  </AnchorPane>
</children>
</VBox>
</children>
</VBox>

我在第一個 FontAwesomeIconView 元素 (WINDOW_MINIMIZE) 上遇到錯誤。

我懷疑這可能是因為 FontAwesomeFX 11 期望 FontAwesomeIconViews 以另一種方式格式化,但我完全不確定。

Error al cargar el archivo vista Login.fxml: javafx.fxml.LoadException: 
.../bin/view/login.fxml:27

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Root cannot be null
    at javafx.graphics/javafx.scene.Scene.<init>(Scene.java:345)
    at javafx.graphics/javafx.scene.Scene.<init>(Scene.java:236)
    at controller.SplashController$SplashScreen$2.run(SplashController.java:78)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:830)

每當您收到javafx.fxml.LoadException時,您都必須閱讀整個堆棧跟蹤,直到最后。 它通常會在最后顯示異常的真正原因

假設您有這個build.gradle文件,並且您的項目是非模塊化的:

plugins {
  id 'application'
  id 'org.openjfx.javafxplugin' version '0.0.8'
}

repositories {
    jcenter()
}

dependencies {
    implementation "de.jensd:fontawesomefx-commons:11.0"
    implementation "de.jensd:fontawesomefx-fontawesome:4.7.0-11"
}

mainClassName = 'org.openjfx.MainApp'

javafx {
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

以及帶有FontAwesomeIconView的 FXML 文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.openjfx.FXMLController">
      <FontAwesomeIconView glyphName="WINDOW_MINIMIZE" size="20" />
</VBox>

然后運行項目:

./gradlew clean run

你得到:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 ...
Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: javafx.fxml.LoadException: 
/.../build/resources/main/org/openjfx/scene.fxml:7
        at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)

如果您停止閱讀,您會認為scene.fxml:7行有問題,它是FontAwesomeIconView

但是,如果您繼續閱讀堆棧跟蹤:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 ...
Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: javafx.fxml.LoadException: 
/.../build/resources/main/org/openjfx/scene.fxml:7
        at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)

...
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at javafx.fxml/com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:262)
...
Caused by: java.lang.reflect.InaccessibleObjectException: \
    Unable to make javafx.css.ParsedValue javafx.css.CssParser.parseExpr(java.lang.String,java.lang.String) accessible: \
    module javafx.graphics does not "opens javafx.css" to unnamed module @32ab3e54
    ...
     at de.jensd.fx.glyphs.GlyphIcon.convert(GlyphIcon.java:248)
... 

最后Caused by正好說明了問題的原因:

模塊 javafx.graphics 不會“打開 javafx.css”到未命名模塊 @32ab3e54

這是由於在GlyphIcon中使用反射來訪問私有 API。

因此,既然您知道了原因,您所要做的就是提供解決方案:在這種情況下,我們會將請求的--add-opens添加到 build.gradle 文件中的 jvm args 中:

run {
    jvmArgs = ["--add-opens", "javafx.graphics/javafx.css=ALL-UNNAMED"]
}

再次運行它將起作用。

注1

如果您有一個模塊化項目,其模塊信息描述符如下:

module hellofx {
    requires javafx.controls;
    requires javafx.fxml;
    requires de.jensd.fx.fontawesomefx.fontawesome;

    opens org.openjfx to javafx.fxml;
    exports org.openjfx;
}

那么你必須添加:

run {
    jvmArgs = ["--add-opens", "javafx.graphics/javafx.css=de.jensd.fx.fontawesomefx.commons"]
}

筆記2

如果您不使用 Gradle,您仍然可以這樣做。

對於初學者,請查看指南 JavaFX 13 和 Eclipse: https://openjfx.io/openjfx-docs/#IDE-Eclipse ,然后選擇您的案例

如果您的案例是 IDE 的非模塊化案例,則在設置 VM arguments 時,如下所示:

--module-path /path/to/javafx-sdk-13/lib --add-modules javafx.controls,javafx.fxml

您現在需要做的就是包含額外的參數,例如:

--module-path /path/to/javafx-sdk-13/lib --add-modules javafx.controls,javafx.fxml \
--add-opens javafx.graphics/javafx.css=ALL-UNNAMED

對於其他情況,邏輯是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM