2014-10-03 71 views
1

我想用JavaFX构建一个简单的应用程序。问题是,当我第一次打开一个窗口(模态)进展顺利。第二次,它给我这个例外:java.lang.IllegalArgumentException:AnchorPane [id = klantroot,styleClass = root]已经设置为另一个场景的根目录

java.lang.IllegalArgumentException异常:AnchorPane [ID = klantroot, 的styleClass =根]已被设为另一个场景

的根既然我相当新的这个我真的不知道如何解决这个问题。有人可以提供一些帮助吗。提前致谢。

在我maincontroller我有这样的代码:

private void showModal(Parent view, String title) { 
    Stage stage = new Stage(); 
    Scene scene = new Scene(view); 
    stage.setScene(scene); 
    stage.initModality(Modality.WINDOW_MODAL); 
    stage.initOwner(this.root.getScene().getWindow()); 
    stage.setTitle(title); 
    stage.showAndWait(); 
} 

@FXML 
private void handleToevoegenKlant() { 
    klantPresenter.setKlant(-1);   
    showModal(klantPresenter.getView(), "Toevoegen klant"); 
} 

在我klantPresenter我有:

<AnchorPane 
    fx:id="klantroot" 
    fx:controller="presenter.KlantPresenter" 
    prefHeight="274.0" prefWidth="483.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 

回答

2

Scene

@FXML private Parent klantroot; 

..... 

public Parent getView() { 
    return klantroot; 
} 

@FXML 
private void close() { 
    Stage stage = (Stage)getView().getScene().getWindow(); 
    stage.close(); 
}    

为KlantView.fxml的代码开头只能有一个根元素,并且每个节点只能是se作为一个场景的根。要将父级设置为另一个场景的根,您需要中断前一个关系。

showModal(...)方法中的代码Scene scene = new Scene(view);将视图作为根分配给场景。所以当showModal(...)被再次调用父视图的相同实例时,会出现错误。

溶液可以根据应用程式逻辑变化:

1)创建父视图的新实例,并把它作为一个参数。

2)添加几行showModal(...)

if(view.getScene() != null) 
    view.getScene().setRoot(null); 

打破旧的关系。

3)你自己的解决方案?

+0

这是完美的工作。非常感谢! – 2014-10-03 11:29:52

+0

我有类似的问题,但我得到scene'e根不能为空,当我尝试设置根。 – 2016-08-24 13:19:37

相关问题