Exception in JavaFX thread java.lang.IllegalArgumentException: Children: duplicate children added

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

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值