【问题标题】:JavaFX 8 Duplicate children after getChildren().clear()JavaFX 8 getChildren().clear() 之后的重复孩子
【发布时间】:2016-04-26 10:29:12
【问题描述】:

我正在清除所有孩子的 Gridpane,然后再次将孩子添加到 Gridpane 但它说有重复项。

public void render(){
    boardPane.getChildren().clear();
    for(int x = 0; x < xSize; x++){
        for(int y = 0; y < ySize; y++){
            boardPane.add(blockBoard[x][y], x, y);
        }
    }
}

blockBoard[x][y] 包含在每个渲染周期被替换的对象。

Exception in thread "JavaFX Application Thread"    
java.lang.IllegalArgumentException: Children: 
duplicate children added:     parent = Grid hgap=0.0, vgap=0.0,
alignment=TOP_LEFT
at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
at   com.sun.javafx.collections.VetoableListDecorator.add
(VetoableListDecorator.java:206)
at javafx.scene.layout.GridPane.add(GridPane.java:965)
at tetris.Game.render(Game.java:121)

【问题讨论】:

  • 您确定blockBoard 本身不包含重复项吗?
  • 数组也可以有重复项???它们包含平铺对象,例如 blockBoard[x][y] = new Tile();有很多新的 Tile();数组中的对象。
  • 是的。没有什么能阻止您将相同的对象两次添加到数组中。
  • 但是如果我在数组中有数千个相同的新 Tile() 对象为什么会出现问题,只要它们位于不同的网格窗格坐标中,javafx 就不应该反对添加它们?我总是在forloop中给出不同的坐标(x,y)
  • 你在某处做了一些奇怪的事情:要么在数组的创建中,要么在Tile 类的定义中。如果您需要帮助完全了解正在发生的事情,您可能需要发布minimal reproducible example

标签: java javafx


【解决方案1】:

这是因为父类的方法 onProposedChange 中的这段代码

childSet.addAll(newNodes);
if (childSet.size() != newLength) {
   throw new IllegalArgumentException(
       constructExceptionMessage(
           "duplicate children added", null));
}

所以你应该从 blockBoard 中删除重复的节点。 可能你应该使用 TableView 来处理这些东西。

【讨论】:

  • TableView 是否允许我添加重复节点?
  • 添加 boardPane.getChildren.remove(blockBoard[x][y]) 解决了这个问题,即使我清除了整个网格,它仍然需要我专门删除确切的对象。 Clear 似乎在最后一个渲染周期中留下了一些东西。
  • "TableView 将允许我添加重复节点吗?"不,它仍然是父类的孩子。但是您可以添加重复数据并将节点管理留给 TableView。
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2020-05-08
相关资源
最近更新 更多