JavaFX8:向ObservableList添加项时的异常:ConcurrentModificationException

时间:2015-05-23 17:24:37

标签: java javafx observablelist

我有一个列出月值的ChoiceBox,当用户选择一个值时,它会执行这个lambda表达式:

<?php

class Speed extends CI_Controller {

        function insert_to_db()
           {

             $this->load->model('add_model');

             $this->add_model->insert_into_db();
             $this->load->view('pages/home');//loading success view

           }


}

以及我如何添加监听器:

private TableView<IncomeFX> tableIncome;
private ChoiceBox<Month> choiceBoxIncomeMonths;

private ChangeListener<Month> setChoiceBoxIncomeMonthsBehaviour(){
    ChangeListener<Month> months = (ObservableValue<? extends Month> observable, Month oldValue, Month newValue) -> {
            incomesData.clear();
            Year selectedYear = choiceBoxIncomeYears.getSelectionModel().getSelectedItem();
            ObservableList<IncomeFX> temp = incomeManager.getIncomesOf(selectedYear, newValue);
            incomesData.addAll(temp);

    };
    return months;
}

当我点击选择框时,我得到:

choiceBoxIncomeMonths.getSelectionModel().selectedItemProperty().addListener(setChoiceBoxIncomeMonthsBehaviour());

它表示问题出在我调用的行中:addAll(temp) 我该怎么解决这个???感谢

2 个答案:

答案 0 :(得分:0)

由于您尚未发布所有代码,我猜您正在尝试与JavaFX数据交互的另一个线程上运行代码。当另一个线程尝试这样做时,它将引发异常,因为只有JavaFX线程应该与数据交互。

我真的无法提供更多的建议,因为我没有完整的代码库,你正在做什么才能真正说“是的,在第X行你有线程Y访问位置X,当它不应该。” / p>

您是否正在另一个主题上添加此内容?你会比我更了解应用程序,因为我没有更多的代码可以使用。

答案 1 :(得分:0)

这是我如何解决它,它是一个我知道的错误代码,但我不知道任何其他解决方案,我必须清除它两次或项目将被添加,就像我没有&#39清除它,如果你有其他解决方案,我会很高兴:

private ChangeListener<Month> setChoiceBoxIncomeMonthsBehaviour(){
    ChangeListener<Month> months = (ObservableValue<? extends Month> observable, Month oldValue, Month newValue) -> {
        if (!lastMonthValuesFired) {
            incomesData.clear();
            Year selectedYear = choiceBoxIncomeYears.getSelectionModel().getSelectedItem();
            ObservableList<IncomeFX> temp = incomeManager.getIncomesOf(selectedYear, newValue);
            ObservableList<IncomeFX> temp2 = FXCollections.observableList(new ArrayList<IncomeFX>());

            for (IncomeFX t : temp) {
                temp2.add(t);
            }
            incomesData.clear();
            incomesData.addAll(temp2);
        }
    };
    return months;
}