2014-08-28 140 views
1

我嘗試使用classloader加載位於外部jar中的類。類「FXMLbase」加載正常,但是當FXMLdocument.fxml嘗試實例化FXMLDocumentController時觸發該錯誤。但是,當「FXMLbase」通過JavaFXApplication5.java(位於外部jar)實例化時,它可以正常工作。有任何想法嗎?外部jar FXML加載異常

類裝載器

File file = new File("C:/Users/Os/Dropbox/CODE_OS/JavaFXApplication5/dist/JavaFXApplication5.jar"); 
URLClassLoader clazzLoader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()}, this.getClass().getClassLoader()); 
Class c = clazzLoader.loadClass("javafxapplication5.FXMLbase"); 
PluginInterface fXMLbase = (PluginInterface) c.newInstance(); 
Parent loadScreen = fXMLbase.getRoot(); 

FXMLbase.java - 外部罐 -

public Parent getRoot() { 
    Parent root = null; 
    try { 
     System.out.println("Class Name:" + getClass().getName());   
     root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
    } catch (IOException ex) {    
     Logger.getLogger(FXMLbase.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return root; 
} 

FXMLdocument.fxml - 外部罐 -

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxapplication5.FXMLDocumentController"> 
<children> 
    <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me! app5" /> 
    <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" /> 
</children> 

FXMLDocumentControlle r.java - 外部罐 -

public class FXMLDocumentController implements Initializable{  
@FXML 
private Label label;  
@FXML 
private void handleButtonAction(ActionEvent event) { 
    System.out.println("You clicked me!"); 
    label.setText("Hello World!"); 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  
} 

JavaFxApplication5.java - 外部罐 -

public void start(Stage stage) throws Exception {   
    FXMLbase fXMLbase=new FXMLbase(); 
    Parent root = fXMLbase.getRoot(); 
    Scene scene = new Scene(root);   
    stage.setScene(scene); 
    stage.show(); 
} 

錯誤:

ago 28, 2014 2:26:16 PM javafxapplication5.FXMLbase getRoot 
SEVERE: null 
javafx.fxml.LoadException: 
file:/C:/Users/Os/Dropbox/CODE_OS/JavaFXApplication5/dist/JavaFXApplication5.jar!/javafxapplication5/FXMLDocument.fxml:9 
.... 
Caused by: java.lang.ClassNotFoundException: javafxapplication5.FXMLDocumentController 
+0

請編輯您的問題,以包括您所得到的確切例外。 – 2014-08-28 19:34:19

回答

2

FXMLLoader在某些時候具有加載控制器類的FXML文件的根元素中fx:controller屬性的值。看起來它使用的是系統類加載器來執行此操作:我認爲這是因爲系統類加載器找到了FXMLLoader類並加載它,而不是用於加載FXMLBase類的類加載器。

我能找到的唯一解決方法是從FXMLbase類中明確設置控制器類,而不是在FXML中指定它。這有點不盡人意;也許我錯過了一個更好的方式。

更新FXMLbase類:

public Parent getRoot() { 
    Parent root = null; 
    try { 
     System.out.println("Class Name:" + getClass().getName());   
     FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml")); 
     loader.setController(new FXMLDocumentController()); 
     root = loader.load(); 
    } catch (IOException ex) {    
     Logger.getLogger(FXMLbase.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return root; 
} 

,你需要從FXML文件中刪除fx:controller屬性。

+0

對此解決方案感興趣的是另一個問題,但是您是否知道如何處理onAction手柄不喜歡沒有控制器組的問題。 – Gapp 2015-04-30 18:38:49

+0

我不明白這個問題。 – 2015-04-30 18:47:21

+0

感謝您的快速響應,問題仍然在爲我拋出錯誤我以爲這可能是因爲一旦你刪除控制器所有的onAction引用被標記爲問題。但它看起來更像是css和圖像引用。 – Gapp 2015-04-30 18:55:36