2012-06-03 21 views
14

Sono nuovo di JavaFX e sto cercando di creare un'architettura MVC corretta data la mia configurazione corrente. Ho fatto clic su un'interfaccia utente utilizzando Scene Builder e ho designato una classe Controller.Pattern MVC in JavaFX con Scene Builder

Startup:

public class Portal extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml")); 

     stage.setTitle("Portal"); 
     stage.setScene(new Scene(root)); 
     stage.show(); 
    } 
} 

E la classe controller contiene il resto del codice.

public class AccommodationPortalView implements Initializable { 
    @Override 
    public void initialize(URL url, ResourceBundle resources) { 
    // Work here. 
    } 
} 

Il mio professore mi ha chiesto di separare ulteriormente le preoccupazioni e le responsabilità di questa applicazione. Il controller non sta solo gestendo lo stato e parlando con il back-end, ma sta anche aggiornando la vista.

La mia prima risposta è stata far diventare la classe Controller la View e creare altre due classi per Controller e Model.

Tuttavia, sono in perdita su come collegare questi pezzi. Non ho mai bisogno di creare un'istanza della vista, quindi non esiste un'istanza View che possa essere trasmessa al mio controller, ad esempio. Successivamente, ho provato a renderli tutti singleton e semplicemente a farli trasferire da Controller in fase di runtime, ma questo mi dà un errore.

public class Portal extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml")); 

     stage.setTitle("Portal"); 
     stage.setScene(new Scene(root)); 
     stage.show(); 

     // Controller gets a View and Model instance in initialize(); 
     // Error: Instantiation and Runtime Exception... 
     PortalController.INSTANCE.initialize(); 
    } 
} 

Come configurare correttamente un pattern MVC utilizzando la configurazione corrente? È richiesta un'architettura diversa?

risposta

23

tuo,
- View è una primaria Stage forniti dalla piattaforma JavaFX all'avvio. Questa fase ha l'unico Scene (che hai creato e impostato) che a sua volta ha un contenuto del nodo genitore root (la tua variabile). Questo nodo root è impostato da FXMLLoader e rappresenta la struttura layout/nodo definita nel file "PortalUI.fxml".
In altre parole, Stage -> Scene -> PortalUI.fxml(root) definirà la parte vista.

- controller è la classe che implementa Initializable e che si è specificato nel file PortalUI.fxml con fx: Controller ="" l'attributo. La classe che hai specificato (PortalController suppongo) verrà creata e invocato il suo metodo initialize() da FXMLLoader. Vale a dire che il Controller verrà creato quando viene caricato il file PortalUI.fxml, quindi non è necessario crearlo e inizializzarlo autonomamente. Per ottenere l'istanza creata/inizializzata del controller dall'aspetto FXMLLoader lo Accessing FXML controller class.

- Il modello è la struttura dati sottostante memorizzata e gestita dal controller. Può essere qualsiasi cosa che rappresenta i "dati". Ad esempio, le classi Persona, PortalInfo ecc.

+0

Ciao! Grazie per la risposta, il link è stato anche un'ottima risorsa! Ho accesso al controller e- oh! Penso di capirlo adesso. Questa è un'architettura molto diversa da quella a cui sono abituata. Grazie mille per avermi aiutato :) – IAE