События мыши на вершине графа JUNG

Я построил графики с помощью JUNG, но я не уверен, как добавить прослушиватели действий мыши в вершины графика.

Ниже приведен образец моего кода, который, как мне кажется, наиболее подходит для решения проблемы.

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);

В частности, я хочу обнаруживать одиночные и двойные щелчки по вершинам графа и воздействовать на них.

Примечание. Я видел пару старых ссылок SO, но ни один из ответов мне не помогает. Если кто-то может просто дать мне псевдокод или указать мне правильное направление, это было бы очень полезно.


person Anand Sainath    schedule 09.02.2014    source источник
comment
Если мой ответ ниже не дает вам необходимой информации, не стесняйтесь комментировать, и я постараюсь лучше соответствовать вашим потребностям. Я попытался спроектировать свой ответ в целом, чтобы сразу был пригодный для использования код и полный пример.   -  person Uli Köhler    schedule 27.02.2014


Ответы (1)


Я думаю, что полный пример послужит вам и другим лучше, чем простое изменение вашего кода. Соответствующая часть здесь, если у вас уже есть VisualizationViewer, использовать этот фрагмент:

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

Помимо обработки событий кликов, это также позволяет добавлять события прессы и выпуска.

Этот автономный класс создает простой граф и — при нажатии на вершину — выводит на стандартный вывод, какая вершина была нажата.

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);
    }
}
person Uli Köhler    schedule 26.02.2014
comment
Спасибо за это! Я попробую и вернусь к вам, если мне понадобятся дополнительные разъяснения! - person Anand Sainath; 27.02.2014
comment
Спасибо! Я отредактировал код для учета обнаружения двойного щелчка. - person Anand Sainath; 28.02.2014
comment
@Uli Köhler, блестящий ответ! Можно ли также получить объект Edge? Теперь я получаю только объект Vertex, что на данный момент действительно здорово. - person AndaluZ; 12.07.2019