2013-06-21 15 views
6

Problema quando si tenta di chiudere la scena corrente e aprire un'altra scena quando è selezionato menuItem. Il mio palco principale è codificato come di seguito:Cambio di scena in javaFX

public void start(Stage primaryStage) throws Exception { 
    primaryStage.setTitle("Shop Management"); 
    Pane myPane = (Pane)FXMLLoader.load(getClass().getResource 
("createProduct.fxml")); 
    Scene myScene = new Scene(myPane);   
    primaryStage.setScene(myScene); 
    primaryStage.show(); 
} 

Poi all'interno createProduct.fxml, quando menuItem è onclick, esso deve svolgere questo:

public void gotoCreateCategory(ActionEvent event) throws IOException { 
    Stage stage = new Stage(); 
    stage.setTitle("Shop Management"); 
    Pane myPane = null; 
    myPane = FXMLLoader.load(getClass().getResource("createCategory.fxml")); 
    Scene scene = new Scene(myPane); 
    stage.setScene(scene); 
    stage.show(); 
} 

Non aperto createCategory.fxml. Tuttavia, il pannello precedente che è createProduct.fxml non si chiude. So che c'è qualcosa chiamato stage.close() per farlo, ma non ho idea di dove implementarlo dato che non passerò la scena dalla main sin dall'inizio. Mi chiedo come dovrei risolvere questo.

Grazie in anticipo.

+0

Sei sicuro di dover aprire l'altra schermata (createCategory.fxml) in una nuova fase? –

+0

Sto cercando di fare come sai Jframe? GetJFrame(). Dispose(); \t \t \t \t \t \t \t eForumForgotPwd MyWindow = new eForumForgotPwd(); . \t \t \t \t \t \t \t myWindow.getJFrame() setVisible (true); Devo chiudere la finestra corrente prima di aprirne una nuova –

risposta

11

Bisogna fare alcuni cambiamenti nel metodo start, come ..

public void start(Stage primaryStage) throws Exception { 
    primaryStage.setTitle("Shop Management"); 

    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createProduct.fxml")); 

    Pane myPane = (Pane)myLoader.load(); 

    CreateProductController controller = (CreateProductController) myLoader.getController(); 

    controller.setPrevStage(primaryStage); 

    Scene myScene = new Scene(myPane);   
    primaryStage.setScene(myScene); 
    primaryStage.show(); 
} 

e la tua CreateProductController.java sarà,

public class CreateProductController implements Initializable { 

    Stage prevStage; 

    public void setPrevStage(Stage stage){ 
     this.prevStage = stage; 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    } 

    public void gotoCreateCategory(ActionEvent event) throws IOException { 
     Stage stage = new Stage(); 
     stage.setTitle("Shop Management"); 
     Pane myPane = null; 
     myPane = FXMLLoader.load(getClass().getResource("createCategory.fxml")); 
     Scene scene = new Scene(myPane); 
     stage.setScene(scene); 

     prevStage.close(); 

     stage.show(); 
    } 

} 
+0

Wow grazie. Ha funzionato perfettamente. Davvero davvero grazie mille. Quindi in pratica si passa il primaryStage nel metodo setPreviousStage nel controller per ottenere il precedenteStage. E poi lo chiudi? Sono stato spiegato nel modo corretto? –

+0

Ma ho ancora un problema. Ad esempio la mia finestra è tutto campo di testo. Quando vado dalla finestra della categoria alla finestra del prodotto senza riempire il campo di testo, ho ottenuto l'errore di eccezione del puntatore nullo –

+0

Aggiungi la convalida sul tuo campo di testo e controlla la nullità. –

2

Si dispone di più modi per risolvere il problema, alcuni dei loro te lo dico Quello che ho capito dalla tua domanda è che vuoi creare un'applicazione che contenga una navigazione (barra dei menu) in alto e, utilizzandola, l'utente può passare a qualsiasi schermata.

Il metodo più semplice è rendere disponibile la barra di navigazione a livello globale, rendendola statica o passandola a schermi o con qualsiasi altro metodo. In secondo luogo, crea una singola schermata (ad esempio il riquadro dei bordi) e carica altri schermi su di essa (il suo centro).

È inoltre possibile utilizzare l'integrazione molla nel progetto in modo da fornire una migliore iniezione dei controller. Vedi riferimento: http://www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

È inoltre possibile creare il proprio controller a schermo singolo e gestire altri schermi utilizzando tale. Vedere rif .: https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

Ma per questo (sopra) è necessario modificare o aggiornare l'architettura corrente.

+0

Quindi, in sostanza, la classe che contiene il metodo di avvio è solo l'impostazione della pagina predefinita da eseguire? E dalla pagina predefinita, ho impostato la barra di navigazione statica e? –