删除GridPane中所有类型的节点

时间:2015-11-30 15:24:01

标签: java groovy javafx javafx-8

我正试图建立一个跳棋游戏,而我现在正试图实现这些游戏的移动。 为此,我决定保留一份清单: blackPieces whitePieces

然后当我做出一个动作时,我会:

  1. 更新相关列表
  2. 遍历GridPane的所有子项
  3. 删除所有检查器片段,即所有类型为Circle的节点
  4. 根据相关列表添加新作品
  5. 但是,我已经陷入第3步,使用以下Groovy代码我只得到 ConcurrentModificationException

    def children = board.getChildren()
    for (child in children) {
        if (child instanceof Circle) {
            board.getChildren().remove(child)
        }
    }
    

    有没有办法在不重绘整个场景的情况下做到这一点?

    感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

甚至还有一种更简单的方法,这要归功于groovy的removeAll方法,这种方法需要关闭。

board.getChildren().removeAll{ it instanceof Circle }

答案 1 :(得分:1)

You shouldn't use instanceof。你应该做的是针对一个接口进行编程,而不是针对一个实现。我的意思是让所有的黑白部分实现一个接口,也许是str = "Hello" # variable str is linked to a string value str = 5 # now it is linked to an integer value; perfectly OK 。然后让您的GridPane由实现Piece的类填充。在Piece界面中,您可以使用一种方法,也许Piece可以进行明显的检查。现在您可以使用您的解决方案,但使用isCircle()方法。

答案 2 :(得分:0)

哇如此随机浏览Groovy备忘单和收集方法我把这个解决方案放在一起。

def pieces = board.getChildren().findAll { it instanceof Circle } // gets all the pieces
board.getChildren().removeAll(pieces) // removes them

取胜。