java.lang.IllegalArgumentException: Children: duplicate children added 异常
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=5.0, vgap=12.0, alignment=TOP_LEFT
当我们试图再同一个GridPane内添加之前添加过的结点时会抛出这种异常,或者是添加相同内容的结点时也有可能抛出这种异常。
我在尝试实现 点击 “+”按钮可以让GridPane面板中之前的电话TextFiled下再最加一个空白内容的TextField时遇到了这个问题;
我直接使用 gridPane.add(appendTextFiled,1,2); 把需要追加的空白TextFiled覆盖了原来位置的TextFiled; //gridPane 是 GridPane的引用
使用gridPane.add(new Label(),0,2); gridPane.add(new Label(),2,2); 覆盖了前面的"邮箱"标签和 “+” 按钮;
之后的操作出现了上述异常:
追加后的下一行 gridPane.add(new Label(“邮箱:”),0,3); gridPane.add(addButton,2,3); //addButton 是我之前“+”按钮的引用
gridPand.add(emailTextFiled,1,3); //emailTextFiled 之前被覆盖的邮箱的TextFiled的引用
以上三个操作都会出现本博客介绍的异常;
本人理解:其实我们在已存在结点下标处再次添加其它结点的时候,虽然“覆盖”了原有的结点,但并没有将原有的结点在GridPane内删除;
已导致我们再次用引用添加之前被“覆盖”结点的时候出现重复添加结点的异常;
解决办法:我们如何有效地将GridPane内原有的结点优雅地删除?
进一步 我们如何有效地将GridPane内原有的结点优雅地删除,然后在它们的位置添加新内容后,再把它们重新添加进来呢?
需要做的就是 把待删除结点(内容)或者之后操作我们可能会删除的结点 的引用保存在一个相应类型的引用变量里面,
然后使用 GridPane 的 gridPane.getChildren().remove(reference); //reference待删除结点的引用,我们之前保存的那个待删除结点(内容)或者之后操作我们可能会删除的结点 的引用
到达删除 GridPane 内结点的目的;之后我们再使用 gridPane.add(reference,columnIndex,rowIndex); 将之前删除的结点重新加到 GridPane面板中。
拓展:JavaFX中有些类型的结点对象无法重复添加到一个相同的结点(例如:相同面板中),如果重复添加则有可能出现类似于这种的异常;
少许灵感来源:https://stackoverflow.com/questions/35157701/adding-duplicate-objects-to-gridpane-as-new-row