2016-04-06 26 views
2

別のクラスのシーンに変更したいと思っていますが、大きな困難があります。JavaFXでのシーンの変更NullPointerException

これで2番目の画面に問題はありませんが、最初の画面に戻るとNullPointerExceptionが表示されます。

助けていただければ幸いです。事前に多くの感謝。

メインクラス

public class Main extends Application { 

Stage ps; 
Group root = new Group(); 
Scene s = new Scene(root, 300, 300, Color.AQUA); 
Controller con = new Controller(); 


public void start(Stage primaryStage) throws Exception { 
    ps = primaryStage; 
    con.buttonLayout(); 
    buttonLayout(); 

    primaryStage.setTitle("Hello World"); 
    ps.setScene(s); 
    primaryStage.show(); 
} 

public void buttonLayout() { 
    Button but = new Button("first"); 

    but.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      ps.setScene(con.s); 
     } 
    }); 

    root.getChildren().add(but); 
} 


public static void main(String[] args) { 
    launch(args); 
} 
} 

他のクラス

public class Controller{ 
Group root = new Group(); 
Scene s = new Scene(root, 300, 300, Color.BLACK); 


public void buttonLayout() { 
    Button but = new Button("back to first"); 

    but.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      Main main = new Main(); 
      main.ps.setScene(main.s); 
     } 
    }); 

    root.getChildren().add(but); 
} 
} 
+0

'あなたがそれに' setScene'を呼び出すときにnullポインタ例外を取得するようmain.ps'は、初期化されることはありません。 –

答えて

4

再構築、アプリケーション、代わりに一つだけの二つのコントローラを作成します。つまり、各シーンに1つのコントローラーがあります。主なアプリケーションでは、最初のシーンを設定するために最初のコントローラーを呼び出すだけです。


、キャッシュではないシーンやコントローラーを行いFXMLを使用せず、完全にコンテンツを置き換え、追加の簡単な例:ここでは

はサンプルです各ナビゲーション上のシーンの数:

firstsecond

Main.java

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class Main extends Application { 
    public void start(Stage stage) throws Exception { 
     Controller1 controller1 = new Controller1(); 
     Scene scene = new Scene(
       controller1.getContent(), 300, 300, Color.AQUA 
     ); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Controller.java

import javafx.scene.Parent; 

public interface Controller { 
    Parent getContent(); 
} 

Controller1.java

import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 

public class Controller1 implements Controller { 
    private final StackPane root; 

    public Controller1() { 
     Button navToSecond = new Button("second"); 

     navToSecond.setOnMouseClicked(event -> { 
      Controller2 controller2 = new Controller2(); 
      navToSecond.getScene().setRoot(controller2.getContent()); 
     }); 

     root = new StackPane(navToSecond); 
    } 

    @Override 
    public Parent getContent() { 
     return root; 
    } 
} 

Controller2.java

import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 

public class Controller2 implements Controller { 
    private final StackPane root; 

    public Controller2() { 
     Button navToFirst = new Button("first"); 

     navToFirst.setOnMouseClicked(event -> { 
      Controller1 controller1 = new Controller1(); 
      navToFirst.getScene().setRoot(controller1.getContent()); 
     }); 

     root = new StackPane(navToFirst); 
    } 

    @Override 
    public Parent getContent() { 
     return root; 
    } 
} 
+0

ごめんなさい。名前コントローラを無視してください。私は実際にfxmlを使用していません –

+0

FXMLを使用しているかどうかにかかわらず原則は同じです。 – jewelsea

+0

これは私にエラーが表示されます: 'ルートはnullではありません' –

関連する問題