2014-02-09 3 views
3

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 링크를 보았지만 그 중 아무 것도 나에게 도움이되지 않는 것 같습니다. 누군가가 의사 코드를 제공하거나 올바른 방향으로 나를 가리킬 수 있다면 정말 도움이 될 것입니다.

+0

내 대답은 당신에게 필요한 정보를 제공하지 않는다면 언제든지 의견을 말하면 귀하의 필요에 더 잘 부합하려고 노력할 것입니다. 나는 일반적으로 내 대답을 디자인하려고 노력 했으므로 즉시 사용할 수있는 코드와 전체 예제가있다. –

답변

5

전체 예제가 코드를 수정하는 것보다 더 나은 서비스를 제공한다고 생각합니다. 여기에 관련 부분은 이미이 조각 사용하려면 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); 
    } 
} 
+0

감사합니다. 더 이상의 설명이 필요한 경우를 대비하여이 내용을 시험해보고 다시 알려 드리겠습니다. –

+1

감사! 더블 클릭 감지에 대한 코드를 편집했습니다. –