Внешнее исключение загрузки jar FXML

Я пытаюсь загрузить класс, расположенный во внешней банке, с помощью загрузчика классов. Класс «FXMLbase» загружается нормально, но ошибка возникает, когда FXMLdocument.fxml пытается создать экземпляр FXMLDocumentController. Однако, когда экземпляр «FXMLbase» создается через JavaFXApplication5.java (расположенный во внешнем банке), он работает нормально. Любые идеи?

Загрузчик классов

 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 -- внешняя банка --

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

person Oscar Hurtado Morato    schedule 28.08.2014    source источник
comment
Пожалуйста, отредактируйте свой вопрос, указав точное исключение, которое вы получаете.   -  person CAG Gonzo    schedule 28.08.2014


Ответы (1)


FXMLLoader в какой-то момент должен загрузить класс контроллера из значения атрибута fx:controller в корневом элементе файла FXML. Похоже, что для этого используется загрузчик системных классов: я думаю, это потому, что загрузчик системных классов находит класс 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;
}

и вам нужно удалить атрибут fx:controller из файла FXML.

person James_D    schedule 29.08.2014
comment
Заинтересовано в этом решении для другой проблемы, однако знаете ли вы, как справиться с тем фактом, что дескрипторы onAction не любят отсутствие установленного контроллера. - person Gapp; 30.04.2015
comment
Я не понимаю этот вопрос. - person James_D; 30.04.2015
comment
Спасибо за быстрый ответ, у меня проблема по-прежнему вызывала ошибки, я думал, что это может быть из-за того, что после удаления контроллера все ссылки onAction помечаются как проблемы. Однако это больше похоже на ссылки на css и изображения. - person Gapp; 30.04.2015
comment
@James_D Вы уже нашли другое решение? - person alexander; 03.03.2019