我有一个FXML文档,我使用自定义控件ImageButton
它存储在包net.aninnovation.baseUtility.view.ImageButton
中这包含3个文件
ImageButton.class , ImageButton.fxml 和 ImageButton.css 。 .class
文件是控制器,.fmxl
是FXML文档,.css
文件是样式表。
现在我在包net.aninnovation.csp.main
中创建一个FXML文档。该文件的名称是 Default.fxml 。这基本上是VBox
,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<?import ...........................?>//Other required Imports
<?import net.aninnovation.baseUtility.view.ImageButton.ImageButton?>
<VBox id="defaultPanel" fx:id="defaultPanel" styleClass="centerBox" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="net.aninnovation.CSP.main.DefaultController">
<children>
<FlowPane>
<children>
.
.
.
. //Other
. //Components
.
<ImageButton/>
.
. //Other
. //Components
.
</children>
</FlowPane>
</children>
<stylesheets>
<URL value="@Default.css" />
</stylesheets>
</VBox>
当我尝试在 SceneBuilder 中加载此文件时,它会出现以下异常:
引起:java.lang.ClassNotFoundException:net.aninnovation.baseUtility.view.ImageButton $ ImageButton at java.lang.ClassLoader.findClass(ClassLoader.java:530) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916) 在javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905) 在javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846) ......还有20个
我发现虽然我导入了net.aninnovation.baseUtility.view.ImageButton
。 ImageButton
,但异常会指出net.aninnovation.baseUtility.view.ImageButton
$ {{1} }。现在为什么ImageButton
被.
取代了?我做错了什么?
$
类的构造函数正在加载FXML文档,如下所示:
ImageButton
ImageButton.fxml
public ImageButton() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("ImageButton.fxml"));
loader.setRoot(this);
loader.setController(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
它们位于包<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<fx:root stylesheets="@ImageButton.css" type="Button" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
<graphic>
<VBox>
<children>
<SVGPath fx:id="svgImage" />
<Label fx:id="label" />
</children>
</VBox>
</graphic>
</fx:root>
中。如前所述, ImageButton.class , ImageButton.fxml 和 ImageButton.css
当我将ImageButton移动到包net.aninnovation.baseUtility.view.ImageButton
和net.aninnovation.csp.main
时。我收到的错误是:
引起:java.lang.ClassNotFoundException:net.aninnovation.csp $ main $ ImageButton at java.lang.ClassLoader.findClass(ClassLoader.java:530) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916) 在javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905) 在javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846) ......还有20个
和
引起:java.lang.ClassNotFoundException:net.aninnovation.csp $ main $ imageButton $ ImageButton at java.lang.ClassLoader.findClass(ClassLoader.java:530) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916) 在javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905) 在javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846) ......还有20个
答案 0 :(得分:0)
其中一个原因可能是net.aninnovation.baseUtility.view.ImageButton.ImageButton
是net.aninnovation.baseUtility.view.ImageButton
例如:
public class Number {
class NestedNumber {
}
}
编译此代码时,java会生成2个文件。 即:
但是,当您访问代码(用于导入)时,仍然使用Number.NestedNumber而不是$。 但是对于Reflection,你使用$。
public static void main(String args[]) throws ClassNotFoundException {
Class<?> forName = Class.forName("Number$NestedNumber");
System.out.println(forName);
}