JavaFX MVC-Modell mit FXML klingt super und alle, aber ich habe Probleme zu finden, wie meine Projektpakete zu organisieren.JavaFX Projektstruktur
Jedes einzelne Tutorial, das ich über JavaFX finde, ist viel zu einfach und unorganisiert: Sie erstellen einfach ein Paket und erstellen dort alles, jeden Controller, jedes fxml, jedes CSS. Ich will das nicht. Ich möchte, dass die Dinge an ihren richtigen Orten sind.
Noch scheint JavaFX "Pfad" scheint ... "limitive". Die Verwendung von URLs macht es so, dass, wenn ich meine Ressourcen auf lokale Dateien beschränken möchte, ich die ganze getClass().getResource("foo.fxml").openStream()
Sache machen muss. Das ist großartig, aber durch das Abrufen von Ressourcen aus einem Klassenpfad stammt der Pfad aus dem Paket, in dem sich die Klasse befindet. Ich wollte irgendwie die Wurzel des Projekts haben. Das würde mein Leben vereinfachen, aber JavaFX scheint nicht so zu funktionieren.
Ermöglicht ein praktisches Beispiel erhalten:
Stellen Sie sich vor mir einen FXML "Login-Bildschirm" habe. Stellen Sie sich vor, ich möchte, dass der Anmeldebildschirm ein Stylesheet verwendet. Im Idealfall wäre diese CSS im selben Paket dieser fxml. Aber was, wenn ich dieselbe .css in einer anderen FXML verwenden möchte? Würde das bedeuten, dass ich beide FXML in dasselbe Paket legen muss? Natürlich muss ich das nicht, aber wie mache ich das dann?
Auch sagen wir, ich möchte die Szene wechseln, wenn ich mich richtig einloggen. Im FXML Controller-Event müsste ich "setScene" aufrufen. Dieser Pfad wäre auch schwer zu bekommen, da ich die FXML in verschiedenen Paketen habe. Es scheint nur, dass entweder alles in einem riesigen aufgeblähten Paket ist oder alles schwer zugänglich ist, ohne auf Hacks wie "../../dir" zurückzugreifen.
Die Henley Sales-Anwendung in http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm scheint ein Beispiel für eine gut organisierte Anwendung zu sein, obwohl die Anwendung eine einzige TabPane ist. Leider (zumindest denke ich) ist die Quelle nicht offen. Seine Idee ist so etwas wie diese:
client Main.class styles.css client.images image.png client.screen1 Screen1.fxml Screen1Controller.java client.screen2 Screen2.fxml Screen2Controller.java ...
Diese doenst wie ein schlechter Start erscheinen, aber es hat ein paar Probleme (oder zumindest ich sehe sich als Probleme).
Für 'The Henley Sales', Es ist schlau, eine Main, die eine der Pakete FXML (einfachen Zugriff, FXML-Verzeichnisse sind unterhalb der Haupt-Klasse) haben würde. Für das Stylesheet müsste dies jedoch durch scene.getStylesheets().add(...);
fest codiert werden. Ich hätte wirklich lieber die Wahl, mein Stylesheet in der FXML zu wählen. Schließlich ist Stylesheet Teil der View-Komponente. Der Zugriff auf die .css-Datei von einer URL in den FXML-Dateien wäre mit dieser Struktur ziemlich schwierig, da sie über ihren Verzeichnissen liegt.
Wie würde ich mit dieser Organisation auch die Szene wechseln? In diesem Projekt wird das nicht benötigt, da das gesamte Projekt ein einzelnes TabbedPane ist. Main ruft es an, und es ist fertig. Keine Notwendigkeit für mehr Swaps. Aber eine einfache Log-in-Szene (oder was auch immer der Grund dafür ist, dass man die gesamte Szene austauschen muss) erfordert den Zugriff auf FXML-Pfade.
Und dann gibt es die Ressourcen. CSS-Dateien müssen möglicherweise Bilder verwenden. Diese Struktur löst sie, indem sie die .css-Datei oben platziert und ein Paket nur für die Dateien erstellt, die die .css-Datei möglicherweise benötigt. Wenn ich wollte, dass eine bestimmte FXML eine andere .css hat, würde ein anderes Problem eintreffen.
Es scheint wie ein Zyklus. Css benötigt Zugriff auf einen freigegebenen Ressourcenordner. FXML benötigt Zugriff auf Css. FXML-Controller benötigen Zugriff auf andere FXML. Ich hoffe, ich war mir über meine Projektstruktur Zweifel klar. Bitte helfen Sie mir bei der Erstellung einer JavaFX-Projektstruktur, die stark genug für eine mehr als einfache Anwendung ist, oder leite mich zu einem guten Quellcode um.
Oh, ich benutze Netbeans übrigens.
Hmm, das klingt interessant, obwohl die CSS von einer URL zu erreichen in einem FXML hart scheint (es sei denn ich die ../ Sache zu tun, die ich etwas nicht mögen ...). Ich konnte die Ressourcen nach der Ansicht Paket tho setzen, ist es sinnvoll, da die Ressourcen Teil der Ansicht sind. Ich weiß nicht, was Dienst und DAO für tho sind, können Sie mir ein Beispiel geben? (Die Anwendung zu erstellen Im gehend verwendet eine MySQL-Server zum Abrufen und Speichern von Daten) – Xkynar
aktualisiert meine Antwort für mehr Klarheit! – ItachiUchiha
Der Nachteil dieses Ansatzes ist, dass Ansicht und Controller sind nicht im selben Verzeichnis und dafür SceneBuilder ist nicht in der Lage, sie zu verbinden. Wenn der ScreenBuilder es nicht benötigen würde, würde ich die fxml in den Ressourcenordner legen. – ChrLipp