Question

I have constructed graphs with JUNG but I'm not sure how to add mouse action listeners to the vertices of the graph.

Below is a sample section of my code that I think is the most relevant for the problem.

layout = new FRLayout2<GraphNode, GraphEdge>(graph);
visualizationViewer = new VisualizationViewer<GraphNode, GraphEdge>(layout, new Dimension(1000, 700));

visualizationViewer.getModel().getRelaxer().setSleepTime(500);
visualizationViewer.setGraphMouse(new DefaultModalGraphMouse<GraphNode, String>());
        visualizationViewer.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.AUTO);
visualizationViewer.setForeground(Color.black);

In particular, I want to detect single and double clicks on the vertices of a graph and act on them.

Note: I have seen a couple of old SO links, but none of the answers seem to be helping me. If someone can just give me the pseudocode or point me to the right direction, it would be really helpful.

Was it helpful?

Solution

I think a full example will serve you and others better than just modifying your code. The relevant part here is, assuming you already have a VisualizationViewer, to use this snippet:

visualizationViewer.addGraphMouseListener(new GraphMouseListener() {...});

Besides handling click events, this also allows you to add press and release events.

This standalone class creates a simple graph and -- when a vertex is clicked on -- prints on stdout what vertex was clicked.

import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.GraphMouseListener;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

public class METest {

    public static void main(String[] args) {
        //Create a test graph
        Graph graph = new SparseGraph<String, String>();
        graph.addVertex("a");
        graph.addVertex("b");
        graph.addVertex("c");
        graph.addVertex("d");
        graph.addEdge("a->b", "a", "b");
        graph.addEdge("a->c", "a", "c");
        graph.addEdge("b->c", "b", "c");
        graph.addEdge("c->d", "c", "d");
        //Metrics
        visualize(graph);
    }

    public static void visualize(Graph graph) {
        //Layout graph.
        Layout layout = new CircleLayout(graph);
        layout.setSize(new Dimension(500, 500)); // sets the initial size of the space
        VisualizationViewer server = new VisualizationViewer(layout);
        server.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
        //Here you add the listener
        server.addGraphMouseListener(new GraphMouseListener() {

            @Override
            public void graphClicked(Object v, MouseEvent me) {
                if (me.getButton() == MouseEvent.BUTTON1 && me.getClickCount() == 2) {
                    System.out.println("Double clicked "+ v);
                }
                me.consume();
            }

            @Override
            public void graphPressed(Object v, MouseEvent me) {
            }

            @Override
            public void graphReleased(Object v, MouseEvent me) {
            }
        });
        //Show the frame
        JFrame frame = new JFrame("Simple Graph View");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(server);
        frame.pack();
        frame.setVisible(true);
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top