2014-12-21 8 views
4

그래프 노드를 생성하고이를 JUNG을 사용하여 연결하기위한 인터페이스를 구현하고 있습니다.JUNG 노드 (정점)를 마우스가 아닌 코드에서 위치를 변경하여 이동하는 방법은 무엇입니까?

내가 그들의 경로edge 둘 사이의 노드를 사용하여 다른 노드로 하나 개의 기존 노드에서 이동할 수있는 노드를 만들려면 (그것은 몇 가지 Data PacketsHosts처럼 노드간에 전송되는 표시에 사용됩니다).

JUNG 노드 (정점)를 마우스로 움직일 수있는 방법에 대한 정보가 있지만 modifying values in the code으로 이동하는 방법에 대한 정보는 없습니다.

비록 노드가 이동하는 경우라도 노드 사이를 이동 경로로 사용하여 노드 사이를 이동하는 것이 가능하고 효율적입니다. JUNG 라이브러리?

의견을 보내 주시면 감사하겠습니다.

답변

1

setLocation 레이아웃 방법으로 정점을 강제로 이동할 수 있습니다. 나는 귀하의 요청과 매우 유사한 것을 만들었습니다. 직선에서 정점 A에서 정점 B로 이동하는 정점을 생성합니다. 당신의 가장자리가 직선이 있다면 그것은 작동 할 수 있습니다 :

VertexCollider vtxCol = new VertexCollider(layout, vv, "nameOfVertexA", "nameOfVertexB"); 
    vtxCol.setMaximumIterations(100); 
    vtxCol.setDesiredPrecision(1); 
    vtxCol.initialize(); 
    Animator animator = new Animator(vtxCol); 
    animator.start(); 

회화 직선 가장자리 :

import java.awt.geom.Point2D; 
import edu.uci.ics.jung.algorithms.layout.AbstractLayout; 
import edu.uci.ics.jung.algorithms.util.IterativeProcess; 
import edu.uci.ics.jung.visualization.VisualizationViewer; 

public class VertexCollider extends IterativeProcess { 

    private static final String COLLIDER = "Collider"; 
    private AbstractLayout<String, Number> layout; 
    private VisualizationViewer<String, Number> vv; 
    private Point2D startLocation; 
    private Point2D endLocation; 
    private Double moveX; 
    private Double moveY; 

    public VertexCollider(AbstractLayout<String, Number> layout, VisualizationViewer<String, Number> vv, String vertexA, String vertexB) { 
     this.layout = layout; 
     this.vv = vv; 
     startLocation = layout.transform(vertexA); 
     endLocation = layout.transform(vertexB); 
    } 

    public void initialize() { 
     setPrecision(Double.MAX_VALUE); 
     layout.getGraph().addVertex(COLLIDER); 
     layout.setLocation(COLLIDER, startLocation); 
     moveX = (endLocation.getX() - startLocation.getX())/getMaximumIterations(); 
     moveY = (endLocation.getY() - startLocation.getY())/getMaximumIterations(); 
    } 

    @Override 
    public void step() { 
     layout.setLocation(COLLIDER, layout.getX(COLLIDER) + moveX, layout.getY(COLLIDER) + moveY); 
     vv.repaint(); 
     setPrecision(Math.max(Math.abs(endLocation.getX() - layout.transform(COLLIDER).getX()), 
      Math.abs(endLocation.getY() - layout.transform(COLLIDER).getY()))); 
     if (hasConverged()){ 
      layout.getGraph().removeVertex(COLLIDER); 
     } 
    } 
} 

당신은이 코드를 예를 들어이를 인스턴스화 할 수

Code Example

+0

어떤 특성이 있는가 기본적으로 모서리가 직선이 아니기 때문에 모서리가 직선으로 설정됩니까? –