2016-04-06 1 views
2

Je souhaite changer de scène dans une autre classe mais j'ai de grandes difficultés.Changement de scène dans JavaFX NullPointerException

Maintenant, je peux passer à la deuxième écran sans problème, mais revenir au premier écran me donne le NullPointerException.

L'aide serait grandement appréciée. Merci d'avance.

Principale

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

Autre classe

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

'main.ps' est jamais initialisé, vous obtenez une exception de pointeur NULL lorsque vous appelez' setScene' dessus. –

Répondre

4

Restructurer votre application, créez deux contrôleurs au lieu d'un seul. Donc vous avez un contrôleur pour chaque scène. Et dans votre application principale, invoquez simplement le premier contrôleur pour définir votre première scène.

Voici un exemple:


Un exemple simplifié supplémentaire qui ne scènes pas de cache ou contrôleurs, ne pas utiliser FXML et remplace complètement le contenu de la scène sur chaque navigation:

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

désolé ignorer le contrôleur de nom. Je n'utilise pas réellement fxml –

+0

Le principe est le même que vous utilisiez ou non FXML. – jewelsea

+0

Cela me donne l'erreur: 'root ne peut pas être nul' –