我有这个问题与javaFX GUI ...我想当我按下按钮我验证是否没有空窗格别我添加一个新窗格..但每次我得到ConcurrentModificationException。我试过打印,我看到只有第一部分在这里执行而不是其他
enter code here
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
for (Node node : vbox.getChildren()) {
if (node instanceof Pane){
Pane pane = (Pane) node ;
if (pane.getChildren().isEmpty()){
vbox.getChildren().remove(node);
}
}``
}
drugrow drug = new drugrow();
vbox.getChildren().addAll(drug.getPane());
}
});
答案 0 :(得分:1)
您在每个循环中迭代vbox的子节点列表,同时从循环体中删除该列表中的节点。迭代器然后通知列表状态已更改,因此抛出ConcurrentModificationException,因为它无法跟踪更改并保证迭代以有序的方式发生。这类迭代器称为失败快速迭代器。
更好的方法是收集要删除的节点,并在完成对列表的迭代后删除它们。
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
final List<Node> removalCandidates = new ArrayList<>();
for (Node node : vbox.getChildren()) {
if (node instanceof Pane){
Pane pane = (Pane) node ;
if (pane.getChildren().isEmpty()){
removalCandidates.add(node);
}
}
}
vbox.getChildren().removeAll(removalCandidates);
drugrow drug = new drugrow();
vbox.getChildren().addAll(drug.getPane());
}
});