簡體   English   中英

JavaFX:FXML中導入類的ClassNotFoundException

[英]JavaFX: ClassNotFoundException for imported class in FXML

我正在嘗試創建一個帶有嵌入字段邊框中的標題的文本字段,如:

在此輸入圖像描述

按照這里發布的解決方案我在我的src>main>java目錄中創建了一個名為TitledBorder.java的.java文件。 我的FXML位於src>main>resources目錄中,我添加了:

<?import TitledBorder?>位於頂部,它沒有顯示如下錯誤: 在此輸入圖像描述

然后我將此代碼添加到FXML中

<HBox prefHeight="100.0" prefWidth="200.0">
    <children>
      <TitledBorder title="Email" >
        <TextField fx:id="emailField" prefHeight="44.0" prefWidth="143.0" />
      </TitledBorder>
    </children>
</HBox>

並且它也沒有顯示任何錯誤。 然后我在src> main> java中的類中啟動我的main方法,但它在.fxml中出現錯誤,說javafx.fxml.LoadException: /C:/Users/ME/Documents/Automation/target/classes/demofxml.fxml

Caused by: java.lang.ClassNotFoundException
    at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2899)

我不確定它為什么引用“/ target / classes / ...”而不是“/ src / main / java / ...”。

這是我發現的唯一的FXML示例,所以我很困惑為什么我在編譯時遇到錯誤,但之前沒有顯示錯誤? 刪除對TitledBorder所有引用允許我的所有代碼正常運行/編譯。 由於它在src包中,我在FXML中使用此代碼連接w / controller fx:controller="loadController"> CSS也正確添加。

思考?

這條線

<?import TitledBorder?>

暗示您將TitledBorder.java文件放到默認包中(即此文件的源代碼中沒有包聲明)。 但是, FXMLLoader的源代碼檢查FXML文件中的導入並在下面的loadType(...)中拆分包路徑名和類名,以便稍后使用loadTypeForPackage()加載導入的類:

private Class<?> loadType(String name, boolean cache) throws ClassNotFoundException {
    int i = name.indexOf('.');
    int n = name.length();
    while (i != -1
        && i < n
        && Character.isLowerCase(name.charAt(i + 1))) {
        i = name.indexOf('.', i + 1);
    }

    if (i == -1 || i == n) {
        throw new ClassNotFoundException();
    }

    String packageName = name.substring(0, i);
    String className = name.substring(i + 1);

    Class<?> type = loadTypeForPackage(packageName, className);

    if (cache) {
        classes.put(className, type);
    }

    return type;
}

// TODO Rename to loadType() when deprecated static version is removed
private Class<?> loadTypeForPackage(String packageName, String className) throws ClassNotFoundException {
    return getClassLoader().loadClass(packageName + "." + className.replace('.', '$'));
}

導入的類名是“TitledBorder”,因此loadType方法第1行的變量i將被計算為name.indexOf('.') = -1 ,並將在下一行代碼中拋出ClassNotFoundException

通常,使用默認包是不好的做法。 將TitledBorder.java放入某個包中並將其導入為

<?import my.some.package.TitledBorder?>

暫無
暫無

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

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