gpt4 book ai didi

JavaFX:FXML 中导入类的 ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-01 04:58:18 24 4
gpt4 key购买 nike

我正在尝试创建一个文本字段,其标题嵌入在字段边框中,例如:

enter image description here

按照贴出的解决方案here我创建了一个名为 TitledBorder.java 的 .java 文件在我的 src>main>java 内目录。我的 FXML 位于 src>main>resources目录,我添加了:
<?import TitledBorder?>在顶部,它没有显示如下错误:
enter image description here

然后我将此代码添加到 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>

它也没有显示错误。然后我启动我的 main 方法,它也在 src>main>java 中的一个类中,但它在 .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 中使用此代码连接 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”,所以变量 iloadType 的第一行方法将被评估为 name.indexOf('.') = -1 , 并且会抛出 ClassNotFoundException在接下来的代码行中。

通常使用默认包是不好的做法。将 TitledBorder.java 放入某个包中并将其导入为
<?import my.some.package.TitledBorder?>

关于JavaFX:FXML 中导入类的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35237132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com