Reputation: 632
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