2013-06-21 100 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(); 
} 

のmenuItemはonclickのときに続いてcreateProduct.fxml以内に、それは、これを実行します。

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 eForumForgotPwd myWindow = new 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(); 
} 

のように、startメソッドでいくつかの変更を行うために、あなた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

うわー、ありがとう。それは完璧に働いた。本当に本当に感謝します。したがって、基本的には、コントローラのsetPreviousStageメソッドにprimaryStageを渡して、previousStageを取得します。そしてそれを閉じますか?私は正しい方法で説明しましたか? –

+0

しかし、私はまだ問題があります。たとえば、私のウィンドウはすべてテキストフィールドです。カテゴリウィンドウから製品ウィンドウにテキストフィールドを埋めることなく移動すると、nullポインタ例外エラーが発生する –

+0

テキストフィールドに検証を追加し、nullをチェックします。 –

2

私はあなたに伝えます。私があなたの質問から理解したのは、上部にナビゲーション(メニューバー)を含むアプリケーションを作成し、それを使ってユーザーが任意の画面に切り替えることができるということです。

最も簡単な方法は、静的にするか画面に渡すか、または他の方法でナビゲーションバーをグローバルに使用できるようにすることです。次に、1つの画面(境界ペイン)を作成し、他の画面(中央)をロードします。

また、プロジェクトでスプリング統合を使用して、コントローラの注入性を向上させることもできます。参照:http://www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

独自の単一画面コントローラを作成し、それを使用して他の画面を管理することもできます。 Ref:https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

ただし、これ(上記)では、現在のアーキテクチャを変更または更新する必要があります。

+0

基本的にstartメソッドを含むクラスは、実行するデフォルトページだけを設定していますか?そして、デフォルトのページから、ナビゲーションバーを静的に設定しました。 –

関連する問題