jak poprawnie niszczyć elementy kolekcji...

0

napisałem sobie taki oto fragment, w celu pozamykania wszystkich okienek

            //CloseFrame extends JFrame implements Closable
            Iterator<ClosableFrame> iterator = xset.iterator();
           
            while(iterator.hasNext()) {
                    ClosableFrame frame = iterator.next();
                    frame.close();
                    frame.dispose();
            }

ale niestety, przy dwóch okienkach w xsecie, program się wysypuje następująco:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at ... i dalej jest wskazanie na miejsce w kodzie: ClosableFrame frame = iterator.next();

oczywiście najpierw zrobiłem tak:

            Iterator<ClosableFrame> iterator = xset.iterator();
           
            while(iterator.hasNext()) {
                    final ClosableFrame frame = iterator.next();
                    SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                     frame.close();
                                    frame.dispose();
                            }
                    });
            }

program się nie wysypuje, no ale dalej nie mam pewności, że się nic nie wysypie później (np. przy większej ilości okienek)
((bo przecież przetwarzanie kolejki swinga może się skończyć wcześniej niż pociągnięcie z iteratora -> i tak z pewnością się może stać!!))

Co więc powinienem zrobić...
Z góry dzięki za pomoc.

(Aha, żeby uniknąć nieporozumień cały kod - ten zewnętrzny, tak czy inaczej jest wykonywany w wątku swinga (przez invokeLater Klasy SwingUtyliteis) - to tak na wszelki wypadek)

karolex

Z góry dzięki za pomoc

1

Dodaj jeszcze iterator.remove() zanim usuniesz ramkę.

0

Wyglada na to ze w czasie gdy Ty iterujesz sobie, cos dokonuje zmian w xset, np dodaje cos lub odejmuje.
Iterator.remove nie ma tu nic do rzeczy.

0
Koziołek napisał(a)

Dodaj jeszcze iterator.remove() zanim usuniesz ramkę.

wielkie, wielkie dzięki - oto rozwiązanie mojego problemu :) - nawet zacząłem czytać o SwingUtylities (ta wiedza mi się zawsze przyda ;), ale tu chodziło wałaśnie o remove() - wielki dzięki!!

::. napisał(a)

Wyglada na to ze w czasie
gdy Ty iterujesz sobie, cos dokonuje zmian w xset, np dodaje cos lub odejmuje.
Iterator.remove nie ma tu nic do rzeczy.

w tym wypadku chodziło właśnie o iterator.remove() z jednego z powodów o którym piszesz - usuwania z xset, którego tutaj nie widać... jednak remove przed frame.close() załatwia zprawę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1