javafx IllegalArgumentException(已设置为另一个场景的根)

时间:2017-09-20 17:20:07

标签: javafx illegalargumentexception

我在应用程序中更改场景时出现问题

Main screen > Login screen

我将主屏幕中的屏幕存储为hashmap<String, Node>,一切顺利,直到我从登录屏幕返回到主屏幕并想再次加载登录屏幕,这里有例外和代码:

java.lang.IllegalArgumentException: AnchorPane@30561c33[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);
}

当我创建新的anchorpane

时,它会起作用
Parent root = new AnchorPane(MyApplication.pages.get("LoginPage"));

但我想理解为什么如果我在同一个舞台上工作会给我一个例外

1 个答案:

答案 0 :(得分:4)

异常是不言自明的:锚窗格不能是两个不同场景的根。而不是每次都创建一个新场景,只需替换现有场景的根:

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