ConcurrentModificationException JavaFX

时间:2017-07-20 19:02:22

标签: java multithreading javafx

我有这个问题与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());
                    }
                });

1 个答案:

答案 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());
            }
        });