我正在实现一个界面来创建图形节点并使用JUNG连接它们. 我想创建一些节点,这些节点可以使用两个节点之间的边缘作为路径从一个现有节点移动到另一个节点(它将用于显示在类似于主
我想创建一些节点,这些节点可以使用两个节点之间的边缘作为路径从一个现有节点移动到另一个节点(它将用于显示在类似于主机的节点之间传输的一些数据包).
互联网上有一些关于如何通过鼠标移动JUNG节点(顶点)的信息,但没有关于通过修改代码中的值来移动它们的信息.
即使有一些移动节点,使用它们之间的边缘作为JUNG库中的移动路径,可以有效地在节点之间移动节点吗?
任何建议,将不胜感激.
您可以使用布局的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