JavaFX:FXML中导入类的ClassNotFoundException
我正在尝试创建一个文本字段,其标题嵌入在字段边框中,如: 按照发布的解决方案,我在JavaFX:FXML中导入类的ClassNotFoundException,javafx,textfield,fxml,titled-border,Javafx,Textfield,Fxml,Titled Border,我正在尝试创建一个文本字段,其标题嵌入在字段边框中,如: 按照发布的解决方案,我在src>main>java目录中创建了一个名为TitledBorder.java的.java文件。我的FXML位于src>main>resources目录中,我添加了: 在顶部,它不会显示以下错误: 然后,我将此代码添加到FXML中 <HBox prefHeight="100.0" prefWidth="200.0"> <children> <TitledBor
src>main>java
目录中创建了一个名为TitledBorder.java
的.java文件。我的FXML位于src>main>resources
目录中,我添加了:
在顶部,它不会显示以下错误:
然后,我将此代码添加到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>
我不知道为什么它引用“/target/classes/…”而不是“/src/main/java/…”
这是我发现的唯一一个FXML示例,所以我很困惑为什么编译时会出现错误,而之前没有显示错误?删除对标题边框的所有引用可以使我的所有代码正常运行/编译。因为它在src包中,所以我在FXML中使用此代码连接w/controllerfx:controller=“loadController”>
。CSS也被正确地添加了
想法?行
<?import TitledBorder?>
导入的类名为“TitledBorder”,因此loadType
方法中第一行的变量i
将被计算为name.indexOf('.')=-1
,并将在下一行代码中抛出ClassNotFoundException
通常,使用默认包是不好的做法。将TitledBorder.java放入某个包中,并将其作为
<?import my.some.package.TitledBorder?>
能否显示从FXML文件导入的内容?至于“我不确定它为什么引用“/target/classes/…”而不是“/src/main/java/…”,肯定是因为它是运行时(而不是编译时)FXML文件的位置.James,问题是我使用的是默认包,应该在我的java包中创建一个包,然后在FXML中引用TitledBorder类。感谢您表现出兴趣。这很有效,感谢Uluk。奇怪的是,我昨晚尝试了这个,但显然我在java
之外创建了一个包我从你的帖子中学到了一些东西,非常感谢。
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('.', '$'));
}
<?import my.some.package.TitledBorder?>