2016-07-21 8 views
3

Ich versuche, eine JavaFX-Anwendung zu entwickeln. Ich muss ein Plugin-System erstellen. Meine Anwendung besteht aus einem GridPane mit 4 Stellen wo ich 4 AnchorPanes einfügen möchte.Dynamisch laden JavaFX-Bereich als Plugin

Ich möchte, dass diese AnchorPanes Plugins werden. Ich habe die folgende Architektur:

My Application 
    + src 
     + controller 
     + view 
     + Main.java 
    + res 
    + lib 
    + plugin 
     + plugin.jar 
      + plugin 
       + Controller.java 
       + view.fxml 

Ich möchte mein Plugin dynamisch mit einem Loader aufrufen.

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(new URL(path)); 
pane = loader.load(); 

Wenn ich etwas nicht berühren, habe ich folgende Fehlermeldung bekommen:

java.lang.ClassNotFoundException: plugin.Controller 

Wenn ich auf meinem .jar rechten Maustaste und ich wählen Sie „als Bibliothek“ in meinem IDE, es funktioniert perfekt. Aber ich möchte meine Plugins dynamisch hinzufügen, also muss ich diese Manipulation nicht machen. Ich denke, es ist ein Problem von ClassPath, aber ich weiß nicht, wie ich es lösen soll.

+0

Was ist der Wert von 'Pfad'? Wenn es sich um einen relativen Pfad handelt, wie lautet Ihr aktuelles Arbeitsverzeichnis? Ist 'loader' ein ClassLoader? Wenn ja, welcher? – Thomas

+0

Der Wert des Pfades ist der korrekte Pfad zu meinem fxml. Es ist kein relativer Pfad. Nun, das Laden der fxml-Datei funktioniert, aber nicht der zugehörige Controller. Loader ist ein FXMLLoader. –

+0

Wenn Sie jars dynamisch zu Ihrer Anwendung hinzufügen wollen (aka plugins), müssen Sie diese entweder auf den Klassenpfad setzen, wenn Sie die Anwendung starten (z. B. etwas wie 'plugin/*' zu Ihrem Klassenpfad hinzufügen) oder einen 'ClassLoader' verwenden das Plugin jar zur Laufzeit. – Thomas

Antwort

0

es ist besser, die plugin main klasse und main-methode zu laden, dann können sie die fxml-datei laden und es wird auch laden fxml's controller. am Ende zurückgeben die Scheiben Objekt (FXML NODE) ​​zu Basis-App.