События мыши на вершине графа 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, но ни один из ответов, похоже, не помогает мне. Если кто-то может просто дать мне псевдокод или указать правильное направление, это будет очень полезно.
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);
}
}