2014-07-25 19 views
11

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.

Antwort

23

IMHO, sollten Sie nicht Pakete abhängig von Ihrem Bildschirm erstellen!

Mein Ansatz zu solchen Anwendungen

  • Ein Paket für controllers diese entsprechenden views
  • Verschiedenes Paket für Service (Business) und dao (Persistenz) Schicht, falls vorhanden
  • Ein Paket/Ordner für Ressourcen wie Bilder, css usw.
  • Ein Paket für fxmls genannt view in den Betriebsmitteln

    src/main/java 
        | 
        controllers 
        | 
        Screen1controller.java 
        Screen2controller.java 
        service 
        | 
        Service1.java 
        dao(persist) 
        | 
        SaveProducts.java 
    src/main/resources 
        | 
        view 
        | 
        screen1.fxml 
        screen2.fxml 
        css 
        | 
        style.css 
        | 
        images 
        | 
        img1.jpg 
        img2.jpg 
    

Die obige Umsetzung kann für ein Maven Projekt in Betracht gezogen werden.

Für ein einfaches Projekt können Sie eine structure here anzeigen. Es ist ein Maven-Projekt!

+0

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

+0

aktualisiert meine Antwort für mehr Klarheit! – ItachiUchiha

+0

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