2013-06-21 13 views
6

Ich habe ein Problem, wenn ich versuche, die aktuelle Szene zu schließen und eine andere Szene zu öffnen, wenn menuItem ausgewählt ist. Meine Hauptbühne ist codiert wie folgt:Szenenwechsel 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(); 
} 

dann innerhalb createProduct.fxml, wenn menuItem Onclick ist, ist es diese durchführen wird:

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(); 
} 

Es createCategory.fxml nicht eröffnet. Das vorherige Panel, das createProduct.fxml ist, wird jedoch nicht geschlossen. Ich weiß, dass es etwas namens stage.close() gibt, um das zu tun, aber ich habe keine Ahnung, wo ich es implementieren soll, da ich die Szene von Anfang an nicht von vorne durchlasse. Ich frage mich, wie ich das beheben sollte.

Vielen Dank im Voraus.

+0

Sind Sie sicher, dass Sie den neuen Bildschirm (createCategory.fxml) in einer neuen Phase öffnen müssen? –

+0

Ich versuche zu tun, wie Sie Jframe wissen? Der getJFrame(). Dispose(); \t \t \t \t \t \t \t eForumForgotPwd myWindow = new eForumForgotPwd(); . \t \t \t \t \t \t \t myWindow.getJFrame() setVisible (true); Ich muss das aktuelle Fenster schließen, bevor ich ein neues öffne. –

Antwort

11

Sie müssen einige Änderungen in Start-Methode machen, wie ..

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(); 
} 

und Ihre CreateProductController.java wird,

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 danke. Es hat perfekt funktioniert. Wirklich, wirklich vielen Dank. Sie übergeben primaryStage also im Prinzip an die Methode setPreviousStage im Controller, um die vorherige Stufe zu erhalten. Und dann schließt du es? Bin ich richtig erklärt? –

+0

Aber ich habe immer noch ein Problem. Zum Beispiel ist mein Fenster alles Textfeld. Wenn ich vom Kategoriefenster zum Produktfenster gehe, ohne das Textfeld auszufüllen, habe ich einen Nullzeiger-Ausnahmefehler erhalten. –

+0

Fügen Sie Ihrem Textfeld eine Validierung hinzu und prüfen Sie, ob der Wert null ist. –

2

Sie haben mehrere Möglichkeiten, um Ihr Problem zu lösen, einige Ich erzähle es dir. Was ich aus Ihrer Frage verstanden habe, ist, dass Sie eine Anwendung erstellen möchten, die oben eine Navigation (Menüleiste) enthält und mit der Sie zu jedem Bildschirm wechseln können.

Die einfachste Methode besteht darin, Ihre Navigationsleiste global verfügbar zu machen, entweder indem Sie sie statisch machen oder indem Sie sie an Bildschirme oder andere Methoden übergeben. Zweitens, machen Sie einen einzelnen Bildschirm (sagen Border Pane) und laden Sie andere Bildschirme (seine Mitte).

Sie können die Federintegration auch im Projekt verwenden, um eine bessere Injektion von Controllern zu ermöglichen. Siehe Ref: http://www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

Sie können auch einen eigenen Bildschirm-Controller erstellen und andere Bildschirme damit verwalten. Siehe Ref: https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

Aber dafür (oben) müssen Sie Ihre aktuelle Architektur ändern oder aktualisieren.

+0

Also im Grunde die Klasse, die die Start-Methode enthalten ist nur nur die Standardseite zu laufen? Und von der Standardseite aus stelle ich die Navigationsleiste auf statisch und? –