如何通过更改代码中的位置而不是鼠标来移动JUNG节点(顶点)?

时间:2014-12-21 14:42:46

标签: jung jung2

我正在实现一个界面,用于创建图形节点并使用 JUNG 连接它们。

我想创建一些节点,可以使用两个节点之间的edge作为路径从一个现有节点移动到另一个节点(它将用于显示一些{{1}在类似Data Packets)的节点之间传输。

互联网上有一些关于如何通过鼠标移动 JUNG 节点(顶点)的信息,但没有关于Hosts移动它们的信息。

即使有一些移动节点,使用它们之间的边缘作为 JUNG 库中的移动路径,可以有效地在节点之间移动节点吗?

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用布局的setLocation方法强制移动顶点。我已经构建了一些与您的请求非常相似的东西。它产生一个顶点,该顶点在直线上从顶点A移动到顶点B.如果你的边缘是直的那么它可能会起作用:

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

您可以使用以下代码对此进行实例化:

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

绘制直边:

Code Example