Kfir Ettinger
Kfir Ettinger

Reputation: 632

Swing's StyleGroupSet ConcurrentModificationException

I'm using Swing gui with my project with GraphStream's graph in it (not sure if it is relevant), and I keep getting ConcurrentModificationException exception from Swing's StyleGroupSet class.

How can I avoid it?

this is the exception's stackTrace:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at java.base/java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1486)
    at java.base/java.util.TreeMap$KeyIterator.next(TreeMap.java:1540)
    at org.graphstream.ui.graphicGraph.StyleGroupSet$ElementIterator.next(StyleGroupSet.java:1427)
    at org.graphstream.ui.graphicGraph.StyleGroupSet$ElementIterator.next(StyleGroupSet.java:1411)
    at org.graphstream.ui.graphicGraph.GraphicGraph.computeBounds(GraphicGraph.java:359)
    at org.graphstream.ui.view.Viewer.computeGraphMetrics(Viewer.java:569)
    at org.graphstream.ui.view.Viewer.actionPerformed(Viewer.java:545)
    at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311)
    at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

By popular demand, Here is My minimized code:

package _IgnoreThatSh1t;

import app.view.frames.SimulatorFrame;

import javax.swing.*;
import java.awt.*;

public class Simulator{
    GraphFrame graphFrame;


    public void start() {
        graphFrame = new GraphFrame();
        graphFrame.setVisible(true);
        graphFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        graphFrame.show();

        while(true){
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            graphFrame.updateFrame();
        }
    }

    public static void main(String[] args) {
        Simulator simulator = new Simulator();
        simulator.start();
    }
}

And the JFrame:


public class GraphFrame extends JFrame {
    private ViewerPipe pipeIn;
    private JPanel graphPanel;
    private Graph graph;
    private Random rand = new Random();

    public GraphFrame(){
        JPanel p = new JPanel();
        JLabel l = new JLabel("my graph!");

        graph = new MultiGraph("my graph");
        System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer");
        Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
        graphPanel = viewer.addDefaultView(false);
        pipeIn = viewer.newViewerPipe();
        initGraph();

        p.add(l);
        p.add(graphPanel);
        this.add(graphPanel);

        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
        setLocationRelativeTo(null);
    }

    private void initGraph(){

        for (int i = 0; i < 1000; i++) {
            graph.addNode(i+"");
        }


        for (int i = 0; i < 500; i++) {
            addRandomEdge();
        }
    }

    private void addRandomEdge(){
        int src = rand.nextInt(graph.getNodeSet().size());
        int dst = rand.nextInt(graph.getNodeSet().size());

        if(src != dst){
            graph.addEdge(src+"-"+dst, src +"", dst +"");
        }
    }

    public void updateFrame(){
        addRandomEdge();
        graph.removeEdge(rand.nextInt(graph.getNodeSet().size()));
        pipeIn.pump();
    }
}

Upvotes: 0

Views: 69

Answers (0)

Related Questions