为什么"。"取而代之的是" $"在java.lang.ClassNotFoundException的类路径中?

时间:2016-11-19 07:44:43

标签: java javafx fxml scenebuilder

我有一个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

位置有3个文件

当我将ImageButton移动到包net.aninnovation.baseUtility.view.ImageButtonnet.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个

1 个答案:

答案 0 :(得分:0)

其中一个原因可能是net.aninnovation.baseUtility.view.ImageButton.ImageButtonnet.aninnovation.baseUtility.view.ImageButton

的NestedClass

例如:

public class Number  {
    class NestedNumber {

    }
}

编译此代码时,java会生成2个文件。 即:

  1. 数$ NestedNumber.class
  2. Number.class
  3. 但是,当您访问代码(用于导入)时,仍然使用Number.NestedNumber而不是$。 但是对于Reflection,你使用$。

    public static void main(String args[]) throws ClassNotFoundException {
            Class<?> forName = Class.forName("Number$NestedNumber");
            System.out.println(forName);
        }