2016-11-19 17 views
2

我有一個FXML文檔在那裏我使用它存儲在包net.aninnovation.baseUtility.view.ImageButton這3個文件 ImageButton.classImageButton.fxmlImageButton.css自定義控件ImageButton.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:淨。在java.lang.ClassLoader.loadClass(ClassLoader.java:424) 上的java.lang.ClassLoader.findClass(ClassLoader.java:530) (java.lang.ClassLoader.loadClass)上的java.lang.ClassLoader.loadClass(ClassLoader.java:424) (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.ImageButtonImageButton,異常狀態net.aninnovation.baseUtility.view.ImageButton$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); 
    } 
} 

ImageButton.fxml

<?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> 

這些位於包net.aninnovation.baseUtility.view.ImageButton。如前所述還有在位置3檔ImageButton.classImageButton.fxmlImageButton.css

當我移動的ImageButton打包net.aninnovation.csp.mainnet.aninnovation.csp.main.imageButton。我有錯誤爲:拋出java.lang.ClassNotFoundException:

所致net.aninnovation.csp $主$ ImageButton的 在java.lang.ClassLoader.findClass(ClassLoader.java:530) 是java .lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader。Java的:2916) 在javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905) 在javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846) ...... 20多個

產生的原因:在java.lang.ClassLoader.loadClass net.aninnovation.csp $主$ $的ImageButton ImageButton控件 在java.lang.ClassLoader.findClass(ClassLoader.java:530) :拋出java.lang.ClassNotFoundException (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

我不知道這是否會導致問題,但軟件包名稱應該是小寫。 – Thilo

+0

通常'$'用於表示內部類。不知道爲什麼它認爲它正在尋找一個內部類。如果包名爲'net.aninnovation.baseUtility.view.imageButton'(注意小寫字母i),是否也有同樣的問題?我無法想象這實際上解決它,雖然... – Krease

+0

@Krease我已經移動了'ImageButton'的代碼,幾個包如'net.aninnovation.baseUtility.imageButton'和'net.aninnovation.csp.main'和'net.aninnovation.csp.main.imageButton'。我發佈了非常不尋常的錯誤。 – Blip

回答

0

之一的可能是net.aninnovation.baseUtility.view.ImageButton.ImageButton其原因是net.aninnovation.baseUtility.view.ImageButton

一個NestedClass例如:

public class Number { 
    class NestedNumber { 

    } 
} 

當該代碼被編譯,生成的java 2個文件。 即:

  1. 號$ NestedNumber.class
  2. Number.class

但是,當你在代碼中訪問(進口),你仍然可以使用Number.NestedNumber而不是$。 但是對於使用$的反射。

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

好吧,那麼爲什麼它會拋出java.lang.ClassNotFoundException? – Blip

+0

你可以粘貼'ImageButton'的代碼嗎? 另外你如何訪問'FXMLLoader.importClass' –

+0

我已經發布了你需要的代碼 – Blip

相關問題