2013-06-21 27 views
6

Mam problem podczas próby zamknięcia aktualnej sceny i otwarcia kolejnej sceny po wybraniu elementu menuItem. Moim głównym etapem jest kodowane, jak poniżej:Przełączanie sceny w 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(); 
} 

Następnie w ciągu createProduct.fxml, gdy MENUITEM jest onclick, że wykona to:

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

To nie otworzył createCategory.fxml. Jednak poprzedni panel, który jest createProduct.fxml, nie zamyka się. Wiem, że jest coś, co nazywa się stage.close(), ale nie mam pojęcia, gdzie go zaimplementować, ponieważ nie przechodzę od sceny z prawej strony od samego początku. Zastanawiam się, jak mam to naprawić.

Z góry dziękuję.

+0

Czy na pewno musisz otworzyć drugi ekran (createCategory.fxml) w nowym etapie? –

+0

Próbuję zrobić tak, jak wiesz Jframe? GetJFrame(). Dispose(); \t \t \t \t \t \t \t eForumForgotPwd MyWindow = nowy eForumForgotPwd(); . \t \t \t \t \t \t \t myWindow.getJFrame() setVisible (prawda); Muszę zamknąć obecne okno przed otwarciem nowego. –

Odpowiedz

11

Trzeba dokonać pewnych zmian w sposobie startu, jak ..

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

a CreateProductController.java będzie,

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 thanks. Działało idealnie. Naprawdę bardzo dziękuję. Zasadniczo przekazujesz primaryStage do metody setPreviousStage w kontrolerze, aby uzyskać poprzedniStart. A potem to zamykasz? Czy jestem wyjaśniony we właściwy sposób? –

+0

Ale nadal mam problem. Na przykład moje okno to całe pole tekstowe. Gdy przechodzę z okna kategorii do okna produktu bez wypełniania pola tekstowego, otrzymałem komunikat o błędzie wyjątku wskaźnika zerowego –

+0

Dodaj sprawdzanie poprawności do pola tekstowego i sprawdź, czy jest pusta. –

2

Masz wiele sposobów, aby rozwiązać problem, kilka z im mówię. Z twojego pytania zrozumiałem, że chcesz stworzyć aplikację, która zawiera nawigację (pasek menu) na górze i przy jej użyciu użytkownik może przełączyć się na dowolny ekran.

Najprostszą metodą jest udostępnienie paska nawigacyjnego na całym świecie, przez uczynienie go statycznym lub przekazaniem go do ekranów lub dowolną inną metodą. Po drugie utwórz pojedynczy ekran (na przykład okienka Graniczna) i załaduj na nim inne ekrany (jego środek).

Możesz również użyć integracji sprężyny w projekcie, aby zapewnić lepsze wtryskiwanie kontrolerów. Patrz Ref: http://www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

Można również utworzyć własny kontroler z jednym ekranem i zarządzać nim za pomocą innych ekranów. Zobacz Ref: https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

Ale do tego (powyżej) musisz zmienić lub zaktualizować swoją obecną architekturę.

+0

Więc, w zasadzie, klasa, która zawiera metodę początkową, jest ustawiona tylko jako domyślna strona do uruchomienia? I na domyślnej stronie ustawiam pasek nawigacji na statyczny i? –