0

I have a following issue. I have a CombBox which should display names of my Quiz class (this class has furthemore a list of Tasks) and I want to remove every single Quiz from the available selection. I also have the Quizzes separated by the Teacher who created them, and I only want to display the according Quizzes to the selected owner in the 2nd ComboBox (I had no issues with this part so far).

Here's my code.

QuizComboBox

public class QuizComboBox extends ComboBox {

public QuizComboBox() {
    List<Quiz> quizList = new QuizDao().getAllQuizes();

    startTask(quizList);

    Platform.runLater(() -> {
        setCellFactory(new Callback<ListView<Quiz>, ListCell<Quiz>>() {
            @Override
            public ListCell<Quiz> call(ListView<Quiz> arg0) {
                return new ListCell<Quiz>() {
                    @Override
                    protected void updateItem(Quiz item, boolean empty) {
                        super.updateItem(item, empty);

                        if (item == null || empty) {
                            setGraphic(null);
                        } else {
                            String quizText = item.getName();
                            setText(quizText);
                        }
                    }
                };
            }
        });
    });
}

public void startTask(List<Quiz> quizList){
    Runnable task = () -> removeEmptyQuizzes(quizList);
    Thread backgroundThread = new Thread(task);
    backgroundThread.setDaemon(true);
    backgroundThread.start();
}

private void removeEmptyQuizzes(List<Quiz> quizList){
    for(Quiz q : quizList){
        if(q.getTaskList().isEmpty()){
            quizList.remove(q);
        }
    }
    Platform.runLater(() -> setItems(FXCollections.observableArrayList(quizList)));
}

}

Here's the listener of the ComboBox with Teachers which updates the items

    private void teacherComboBoxListener(){
    view.getTeacherComboBox().getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Teacher>() {
        @Override
        public void changed(ObservableValue<? extends Teacher> arg0, Teacher oldValue, Teacher newValue) {

            view.getQuizComboBox().setValue(null);

            if(newValue == view.getAllTeachersChoice()){
                List<Quiz> quizList = new QuizDao().getAllQuizes();
                view.getQuizComboBox().startTask(quizList);
            }
            else {
                Teacher selectedTeacher = (Teacher) view.getTeacherComboBox().getSelectionModel().getSelectedItem();
                List<Quiz> quizList = selectedTeacher.getQuizList();
                view.getQuizComboBox().startTask(quizList);
            }
        }
    });
}

I'm getting the following exception

  Exception in thread "Thread-5" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at view.controlElements.QuizComboBox.removeEmptyQuizzes(QuizComboBox.java:51)
    at view.controlElements.QuizComboBox.lambda$startTask$1(QuizComboBox.java:44)
    at java.lang.Thread.run(Thread.java:745)

EDIT: I've tried @fabian's solution and it works with quite a big bug, it removes all the Quizzez with empty TaskList from my database.

    private void removeEmptyQuizzes(List<Quiz> quizList){
    for(Iterator<Quiz> iterator = quizList.iterator(); iterator.hasNext();){
        Quiz q = iterator.next();
        if(q.getTaskList().isEmpty()){
            iterator.remove(); // removed from db also
        }
    }
    Platform.runLater(() -> setItems(FXCollections.observableArrayList(quizList)));
}
  • @fabian Hm, it indeed works now, however, it creates also quite a big bug. It removes all Quizzes with empty TaskList from my database as well. – Jan Štefánik Jan 28 '17 at 13:44
  • @fabian I edited the question if you want to take a look – Jan Štefánik Jan 28 '17 at 13:46
  • You need to explain in detail why removing the empty quizzes as stated in the question is a problem. "It removes all the quizzes with empty task list from my database" is a statement noone can verify. All we see is a list from which items are removed. It would be really strange if that also affected persistent storage. – Matthias Jan 28 '17 at 14:36

0 Answers0