java - JavaFX 并发修改异常

标签 java multithreading javafx

我在 javaFX GUI 上遇到了这个问题...我想当我按下按钮时我验证是否没有空 Pane ,否则我添加一个新 Pane ..但每次我得到 ConcurrentModificationException 。我尝试过打印,我发现这里只执行了 for 的第一部分,而没有执行其他部分

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

最佳答案

您在 foreach 循环中迭代 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());
            }
        });

关于java - JavaFX 并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223227/

相关文章:

java - Thymeleaf:根据条件在 <form> th:action 中进行 POST 或 PUT

c - 在 C 语言中,为什么只在初始化已创建线程列表后才调用 pthread_join?

java - Thread.interrupt() 和 java.io.InterruptedIOException

macos - RuntimeMXBean.getName() 在 Mac OS X Sierra 上挂起 - 如何修复?

java - 帮助我了解 JSF 托管 bean 生命周期

python - tkinter 线程未终止(gif 在无限循环中运行)

java - TableView 中 RadioButton 的奇怪行为

java - 内部图形尚未初始化 : javafx

javascript - 无法在 javafx Webview 上加载 CSS/JS

java - java本体(jena)