2013-06-21 147 views
6

當嘗試關閉當前場景並在選擇menuItem時打開另一個場景時出現問題。我的主舞臺被編碼如下:在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(); 
} 

然後內createProduct.fxml,當菜單項是的onclick,它會執行這樣的:

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

它開闢了createCategory.fxml。但是,前面的createProduct.fxml面板沒有關閉。我知道有一些名爲stage.close()來做到這一點,但我不知道在哪裏實現它,因爲我從一開始就沒有從主要的右邊傳遞場景。我想知道我應該如何解決這個問題。

在此先感謝。

+0

您確定您需要在新階段打開其他屏幕(createCategory.fxml)嗎? –

+0

我想要像你知道的Jframe一樣做? getJFrame()。dispose(); \t \t \t \t \t \t \t eForumForgotPwd mywindow的新= eForumForgotPwd(); \t \t \t \t \t \t \t myWindow.getJFrame()。setVisible(true);我需要在打開新窗口前關閉當前窗口 –

回答

11

你必須要在啓動方法,像一些變化..

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

和你CreateProductController.java會,

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

哇謝謝。它工作完美。真的很感謝。所以基本上你可以將primaryStage傳遞給控制器​​中的setPreviousStage方法來獲得previousStage。然後你關閉它?我以正確的方式解釋了嗎? –

+0

但我仍然有問題。例如我的窗口全是文本框。當我從類別窗口轉到產品窗口而沒有填寫文本字段時,我得到空指針異常錯誤 –

+0

在您的文本字段添加驗證,並檢查爲空。 –

2

你有多種方式來解決你的問題,少數人他們我告訴你。我從你的問題中瞭解到,你想創建一個包含頂部導航(菜單欄)的應用程序,並且通過使用它,用戶可以切換到任何屏幕。

最簡單的方法是使您的導航欄全局可用,或者通過將其設置爲靜態或通過將其傳遞到屏幕或通過任何其他方法。其次,製作一個單一的屏幕(比如邊框窗格)並在其上加載其他屏幕(它的中心)。

您也可以在項目中使用彈簧集成,以便爲您提供更好的控制器注入。參考編號:http://www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

您還可以創建自己的單屏幕控制器並使用它來管理其他屏幕。 參考編號:https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

但是,對於這(上述)你必須改變或更新你當前的架構。

+0

所以基本上包含start方法的類只是設置了默認頁面運行?並從默認頁面,我將導航欄設置爲靜態和? –