【问题标题】:External jar FXML Load Exception外部 jar FXML 加载异常
【发布时间】:2014-08-28 19:08:12
【问题描述】:

我尝试使用类加载器加载位于外部 jar 中的类。 “FXMLbase”类加载正常,但是当 FXMLdocument.fxml 尝试实例化 FXMLDocumentController 时会触发错误。但是,当通过 JavaFXApplication5.java(位于外部 jar 中)实例化“FXMLbase”时,它可以正常工作。有任何想法吗?

类加载器

 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 -- 外部jar --

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 -- 外部jar --

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

FXMLDocumentController.java -- 外部jar --

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 -- 外部jar --

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

【问题讨论】:

  • 请编辑您的问题以包含您遇到的确切异常。

标签: javafx classloader fxml fxmlloader


【解决方案1】:

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 属性。

【讨论】:

  • 对这个解决方案感兴趣,但是您知道如何处理 onAction 句柄不喜欢没有设置控制器的事实。
  • 我不明白这个问题。
  • 感谢您的快速响应,我认为问题仍然在抛出错误,我认为这可能是因为一旦您移除控制器,所有 onAction 引用都被标记为问题。但是它看起来更像是 css 和图像引用。
  • @James_D 你找到其他解决方案了吗?
猜你喜欢
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2019-04-21
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多