2017-09-20 7 views
0

J'ai problème avec le changement des scènes dans mon application qui ressembleJavaFX IllegalArgumentException (est déjà défini comme la racine d'une autre scène)

Main screen > Login screen 

je stocke des écrans dans le fichier principal comme hashmap<String, Node> et tout est bon jusqu'à ce que je vais retour de l'écran de connexion à l'écran principal et que vous souhaitez charger à nouveau l'écran de connexion, voici exception et code:

java.lang.IllegalArgumentException: [email protected][styleClass=root]is already set as root of another scene 

public static final HashMap<String, Parent> pages = new HashMap<>(); 

@FXML 
private void LogIn(ActionEvent event) { 
    Button button = (Button) event.getSource(); 
    Stage stage = (Stage) button.getScene().getWindow(); 
    if(stage.getScene() != null) {stage.setScene(null);} 
    Parent root = MyApplication.pages.get("LoginPage"); 
    Scene scene = new Scene(root, button.getScene().getWidth(), button.getScene().getHeight()); 
    stage.setScene(scene); 
} 

Il fonctionne quand je crée de nouveaux anchorpane

Parent root = new AnchorPane(MyApplication.pages.get("LoginPage")); 

Mais je veux comprendre pourquoi il me donne une exception si je travaille sur la même scène

Répondre

1

L'exception est assez explicite: le volet d'ancrage ne peut pas être la racine de deux scènes différentes. Au lieu de créer une nouvelle scène à chaque fois, il suffit de remplacer la racine de la scène actuelle:

@FXML 
private void LogIn(ActionEvent event) { 
    Button button = (Button) event.getSource(); 
    Scene scene = button.getScene(); 
    Parent root = MyApplication.pages.get("LoginPage"); 
    scene.setRoot(root); 
} 
+0

Vraiment thats grâce a résolu mon problème –

+0

@JasonBourne, vous devez marquer cette question comme la réponse correcte. – Kerry