2014-07-25 16 views
11

Il modello MVC di JavaFX utilizzando FXML sembra fantastico e tutto, ma ho difficoltà a scoprire come organizzare i pacchetti del mio progetto.Struttura del progetto JavaFX

Ogni singolo tutorial che trovo su JavaFX è troppo semplice e non organizzato: semplicemente creano UN pacchetto e creano tutto lì, ogni controller, ogni fxml, ogni css. Non lo voglio Voglio che le cose siano nei loro posti giusti.

Ancora, il "pathing" di JavaFX sembra ... "limitivo". L'uso degli URL fa sì che se voglio limitare le mie risorse ai file locali, devo fare l'intera cosa getClass().getResource("foo.fxml").openStream(). È grandioso, ma ottenendo risorse da un percorso di classe, il percorso proviene dal pacchetto in cui si trova la classe. Volevo la radice del progetto. Ciò semplificherebbe la mia vita, ma JavaFX non sembra funzionare così.

consente di ottenere ad un esempio pratico:

Immaginate Ho una "schermata di login" FXML. Immagina di volere che la schermata di login utilizzi un foglio di stile. Idealmente, quel css sarebbe nello stesso pacchetto di quel fxml. Ma cosa succede se voglio usare lo stesso file .css in un altro FXML? Ciò significa che devo inserire entrambi FXML nello stesso pacchetto? Ovviamente non "ho bisogno di", ma come faccio allora?

Inoltre, diciamo che voglio cambiare scena quando accedo correttamente. Nell'evento corretto del controller FXML, dovrei chiamare un "setScene". Quel percorso sarebbe anche difficile da ottenere dal momento che se ho FXML in diversi pacchetti. Sembra che tutto sia racchiuso in un gigantesco pacchetto gigante o che tutto sia difficile da accedere senza ricorrere a hack come "../../dir".

L'applicazione Henley Sales in http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm sembra essere un esempio di un'applicazione ben organizzata, sebbene l'applicazione sia un singolo TabPane. Sfortunatamente (almeno credo) la fonte non è aperta. La sua idea è qualcosa di simile:

client 
    Main.class 
    styles.css 
     client.images 
      image.png 
     client.screen1 
      Screen1.fxml 
      Screen1Controller.java 
     client.screen2 
      Screen2.fxml 
      Screen2Controller.java 
     ... 

Questo doenst sembrare una brutta partenza, ma ha alcuni problemi (o almeno li vedo come i problemi).

Per 'The Henley Sales', è intelligente avere un Main che chiamerebbe uno dei pacchetti 'FXML (facile accesso, le directory di FXML sono al di sotto della classe Main). Ancora, per il foglio di stile, che dovrebbe essere codificato da scene.getStylesheets().add(...);. Preferirei davvero avere la scelta di scegliere il mio foglio di stile nel FXML. Dopotutto, il foglio di stile fa parte del componente Visualizza. Accedere al file .css da un URL negli FXML sarebbe piuttosto difficile con questa struttura, dato che è al di sopra delle loro directory.

Inoltre, con questa organizzazione, come cambierei la scena in modo competente? In questo progetto, questo non è necessario perché l'intero progetto è un singolo TabbedPane. Main lo chiama, ed è fatto. Non c'è bisogno di più scambi. Ma una semplice scena di accesso (o qualunque sia la ragione per cui è necessario scambiare l'intera scena) richiede la necessità di accedere ai percorsi FXML.

E poi ci sono le risorse. I file CSS potrebbero dover utilizzare le immagini. Quella struttura lo risolve posizionando il file .css sopra e creando un pacchetto solo per i file di cui potrebbe avere bisogno il file .css. Se volessi un particolare FXML per avere un .css diverso, sarebbe arrivato un altro problema.

Sembra un ciclo. Css ha bisogno di accedere a una cartella di risorse condivisa. FXML ha bisogno di accedere a Css. I controller FXML hanno bisogno di accedere ad altri FXML. Spero di essere stato chiaro riguardo ai dubbi sulla struttura del mio progetto. Per favore aiutatemi nella creazione di una struttura di progetto JavaFX che sia abbastanza potente per un'applicazione più che basilare, o che mi reindirizzi ad un buon codice sorgente.

Oh, sto usando Netbeans a proposito.

risposta

23

IMHO, non è necessario creare pacchetti a seconda dello schermo!

mio approccio verso tali applicazioni

  • Un pacchetto per la corrispondente controllers di questi views
  • Diverso del servizio (business) e dao (persistenza) strato, se esiste
  • Un pacchetto/cartelle per il pacchetto risorse come immagini, css ecc
  • Un pacchetto per fxml chiamato view nelle risorse

    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 
    

L'implementazione di cui sopra può essere considerata per un progetto Maven.

Per un progetto semplice, è possibile visualizzare un structure here. È un progetto maven!

+0

Hmm che sembra interessante, anche se il css sembra difficile da raggiungere da un URL in un FXML (a meno che non faccia la ../cosa che in qualche modo non mi piace ...). Potrei mettere le risorse dopo il pacchetto di visualizzazione tho, Ha senso dato che le risorse fanno parte della View. Non so che Servizio e DAO sono per questo, puoi darmi un esempio? (L'applicazione che sto per creare utilizza un server MySQL per il recupero e l'archiviazione dei dati) – Xkynar

+0

Aggiornamento della mia risposta per maggiore chiarezza! – ItachiUchiha

+0

Lo svantaggio di questo approccio è che la vista e i controller non sono nella stessa directory e quindi SceneBuilder non è in grado di collegarli. Se ScreenBuilder non lo richiedesse, inserirò il file fxml nella cartella delle risorse. – ChrLipp

Problemi correlati