我正在实现一个界面,用于创建图形节点并使用 JUNG 连接它们。
我想创建一些节点,可以使用两个节点之间的edge
作为路径从一个现有节点移动到另一个节点(它将用于显示一些{{1}在类似Data Packets
)的节点之间传输。
互联网上有一些关于如何通过鼠标移动 JUNG 节点(顶点)的信息,但没有关于Hosts
移动它们的信息。
即使有一些移动节点,使用它们之间的边缘作为 JUNG 库中的移动路径,可以有效地在节点之间移动节点吗?
任何建议都将不胜感激。
答案 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();
绘制直边: