GraphStream Users

Archives de la liste Aide

RE: Concurrent modification exception with Swing; getNode() method not yet implemented

Chronologique Discussions 
  • From: "Steven E. Noel" <snoel AT>
  • To: "graphstream-users AT" <graphstream-users AT>
  • Subject: RE: Concurrent modification exception with Swing; getNode() method not yet implemented
  • Date: Wed, 25 Sep 2013 18:07:02 +0000
  • Accept-language: en-US

Thanks a lot Guilhelm, this post was very helpful.  It solved the concurrent modification problem I was having.  But when I put add other Swing widgets, I am losing the handle to the GraphStream view.  I have posted sample code here: .


In my example, I start with your example (  I then create a JFrame and place the GraphStream View into the JFrame along with a JToggleButton.


Without the JToggleButton added to the frame, the GraphStream View works as expected, i.e., the mouse clicks generate events that InternalMouseManager handles and shows the JOptionPane.


But when the JToggleButton *is* added to the frame, this no longer works, i.e., mouse clicks are not causing the JOptionPane



Any suggestions?  Thanks again.


PS, thanks for all the effort in developing GraphStream, it is a truly remarkable tool.



From: Guilhelm Savin <guilhelm.savin AT>
Sent: Tuesday, September 24, 2013 6:36 PM
To: graphstream-users AT; Steven E. Noel
Subject: Re: Concurrent modification exception with Swing; getNode() method not yet implemented
Hi Steve,

GraphicGraph should not be directly handled.
You should have a look to this thread first : about using graph inside the swing thread.
Then if you still have questions, we will try to help you.


"Steven E. Noel" <snoel AT> a écrit :

I have a question that involves GraphStream within a Swing GUI.  I know that is slightly out of scope of GraphStream per se, but my investigations led to a final question that I think is relevant.


I followed the tutorial in integrating a GraphStream viewer in a Swing GUI ( and everything was ok.  My problem was later getting a ConcurrentModificationException while trying to modify a graph in response to a Swing event.


My goal is to be able to handle Swing events (buttons, etc.) to dynamically update a GraphStream graph (modify styles, etc.).  I wrote a small test of that.  Here is an excerpt:


/* =============================== */

import java.util.Collection;

import org.graphstream.graph.Node;
import org.graphstream.ui.graphicGraph.GraphicGraph;
import org.graphstream.ui.swingViewer.Viewer;

public class ToggleGreen {
    javax.swing.JToggleButton button;
    public javax.swing.JToggleButton getButton() {return button;}
    public void setButton(javax.swing.JToggleButton button) {this.button = button;}


    private static GraphicGraph graph = null;
    public GraphicGraph getGraph() {return graph;}
    public void setGraph(GraphicGraph _graph) {graph = _graph;}

    ToggleGreen(Viewer networkViewer) {

        button = new javax.swing.JToggleButton("Green",  false);
        button.addItemListener (new java.awt.event.ItemListener() {

            public void itemStateChanged(java.awt.event.ItemEvent event) {
                if (button.isSelected()) {
                    System.out.println("Green ON");
                    /* This throws 
                     *  Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
                     *   at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
                     *   at java.util.HashMap$ Source)
                     *  at org.graphstream.ui.graphicGraph.StyleGroupSet$
                     *  at org.graphstream.ui.graphicGraph.StyleGroupSet$
                     *  at ToggleGreen$1.itemStateChanged( */
                    for (Node node: getGraph().getEachNode()) {
                        node.addAttribute("", "fill-color:green;");


                    /* This throws
                     *  Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: not implemented !
                     *  at org.graphstream.ui.graphicGraph.GraphicGraph.getNode(
                     *  at ToggleGreen$1.itemStateChanged( */
                    //Collection<Node> nodeSet = getGraph().getNodeSet();
                    //for (int i = 0; i < nodeSet.size(); i++) {
                    //    Node node = getGraph().getNode(i);
                    //    node.addAttribute("", "fill-color:green;");
/* =============================== */


This class creates a JToggleButton, which I added to my GUI, along with a GraphStream viewer.  The instatiated viewer is passed into this class, giving a handle to the graph in the viewer.  The button event then attempts to add a green color to each graph node.


With the code above, this throws the concurrent modification exception (after painting a single node green).  I am somewhat new to Swing, but I see that this is a well-known problem with iterating over Java Collections within threads.  I tried various suggestions such as synchronized(), but was never successful in eliminating the concurrent modification exception.  As a sanity check, I tested that


    for (Node node: getGraph().getEachNode()) {

        node.addAttribute("", "fill-color:green;");



works fine outside of the Swing thread.


Another suggestion I saw was to reference the list/array using its index rather than an iterator, which is commented out in the code example.  That is this:


    for (int i = 0; i < nodeSet.size(); i++) {

        Node node = getGraph().getNode(i);

        node.addAttribute("", "fill-color:green;");



For this, I get "java.lang.RuntimeException: not implemented !"  Presumably this is coming from a GraphStream try/catch, indicating that the getNode() method is not yet implemented?


Thanks in advance for any suggestions.





Archives gérées par MHonArc 2.6.16.

Top of page