Hallo,
Ich habe folgendes Problem:Bisher habe ich meine Layouts mit Swing gemacht und kam gut zurecht. Die Möglichkeiten von JavaFX begeistern mich aber enorm und so möchte ich gerne die GUI meines aktuellen Programms mit JavaFX realisieren. Allerdings werden gut 2/3 der visuellen Inhalte erst zur Laufzeit generiert werden, bzw. während der Laufzeit darüber entschieden was angezeigt wird und was nicht. Mir erscheint darum FXML als eher ungeeignet. Ich suche nun einen Weg folgendes mit JavaFX zu realisieren:Ich starte eine Main Klasse. Diese startet mir einen Controller und dieser wiederrum kümmert sich dann um GUI. (main Methode läge in Klasse Main)
Mit JavaFX ist es offensichtlich möglich, in der Gui einen Controller zu starten, ich hätte es aber gerne umgekehrt. Ist das möglich? Denn in der main Methode rufe ich ja die launch Methode auf. Also ist meine Mainklasse dann vom Typ Main extends Application was wiederum dazu führt, dass ich die start() Methode implementieren muss usw.
Hi thorakz,
Hallo,
Ich habe folgendes Problem:Bisher habe ich meine Layouts mit
Swing gemacht und kam gut zurecht. Die Möglichkeiten von
JavaFX begeistern mich aber enorm und so möchte ich gerne die
GUI meines aktuellen Programms mit JavaFX realisieren.
Allerdings werden gut 2/3 der visuellen Inhalte erst zur
Laufzeit generiert werden, bzw. während der Laufzeit darüber
entschieden was angezeigt wird und was nicht. Mir erscheint
darum FXML als eher ungeeignet. Ich suche nun einen Weg
folgendes mit JavaFX zu realisieren:Ich starte eine Main
Klasse. Diese startet mir einen Controller und dieser
wiederrum kümmert sich dann um GUI. (main Methode läge in
Klasse Main)
Mit JavaFX ist es offensichtlich möglich, in der Gui einen
Controller zu starten, ich hätte es aber gerne umgekehrt. Ist
das möglich? Denn in der main Methode rufe ich ja die launch
Methode auf. Also ist meine Mainklasse dann vom Typ Main
extends Application was wiederum dazu führt, dass ich die
start() Methode implementieren muss usw.
Hoffe habe dich richtig verstanden, also die start()-Methode musst du immer implementieren, was du jedoch möchtest (soweit verstanden) ist, das ganze Viewzeugs dort auszulagern?
Das geht mit dem MVP-Prinzip und Dependency Injection.
Bsp: Du implementierst eine Bean (Model) , dann deinen eigenen Controller der die Bean injected, erstellst dein FXML-File, dann eine Factory(als ApplicationsContext) in der du beide (Bean und Controller) erzeugst und baust dir einen eigenen FXMLLoader in dem du den ApplicationsContext setzt und eine load-Methode implementierst. Dein StarterApp(Main) sieht dann so aus:
public class StarterApp extends Application
{
public static void main(String[] args)
{
launch(args);
}
public void start(Stage stage) throws Exception
{
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(MyAppFactory.class);
MyFxmlLoader loader = new MyFxmlLoader(context);
Parent root = (Parent) loader.load("/sample.fxml", MyController.class);
Scene scene = new Scene(root, 320, 240);
scene.getStylesheets().add("/fxmlapp.css");
stage.setScene(scene);
stage.setTitle("Mein App");
stage.show();
}
}
Abhängig davon, ob du jetzt eine Web oder JEE oder Desktop-Applikation schreibst unterscheidet sich das Vorgehen (aber nur minmal). Für Desktop Applikation nimmt man
google-guice (Dependency Injection)… für JEE nimmt man CDI.
Hier ein Framework für JavaFX, was das MVP-Prinzip implementiert https://github.com/AdamBien/afterburner.fx
Du könntest am Anfang auch ersteinmal nur das MVP-Prinzip einsetzen, um an dein Wunsch zu kommen, aber MVP mit DI ist eine feine Sache. Hier ein Beispiel aus dem Netz nur MVP:
http://programmingwithpassion.wordpress.com/2013/07/…
Gruß XXD
Hallo XXD,
Vielen Dank für deine ausführliche Antwort. Genau danach habe ich gesucht.
Wenn man nun weiß, nach was genau man googlen möchte, findet man auch mehr
gruß
thorakz