我需要以特定方式排列节点。我尝试过使用静态布局。我可以更改节点的位置,但无法将边缘放置在特定位置。静态布局有一个 setLocation 方法,我用来更改节点的位置,但对于边,我不知道如何将它们放置在特定位置,以便新定位的节点与边连接。
另一个问题:如何通过覆盖变换方法来改变 Jung 中边缘的形状。
我需要以特定方式排列节点。我尝试过使用静态布局。我可以更改节点的位置,但无法将边缘放置在特定位置。静态布局有一个 setLocation 方法,我用来更改节点的位置,但对于边,我不知道如何将它们放置在特定位置,以便新定位的节点与边连接。
另一个问题:如何通过覆盖变换方法来改变 Jung 中边缘的形状。
JUNG 目前没有为边缘放置提供良好的支持。 EdgeShape
,特别是EdgeShape.Orthogonal
,将向您展示存在哪些内置支持。
我知道这个线程有点旧,但我认为它需要恢复 - 希望这个问题还没有得到回答。原因是 O'Madadhains 先生的回答对我没有帮助。(也许是因为我的缺陷和理解文档的意愿)在对 JUNG 技术进行了一些工作之后,我很高兴现在得到一些合格的评论。
有两种(似乎是)简单的方法可以在静态布局中转换边缘。
第一种方式是覆盖直接影响边缘形状的Transformer的“transform”方法:
Transformer<Graph<Context<String, String>, String>, Shape> edgeTransformer = new Transformer<Graph<Context<String,String>,String>,Shape>(){
@Override
public Shape transform(Graph<Context<String, String>, String> graphStringContext)
{
return (new Line2D.Double());
}
};
(如果使用“图表”图表)
关于感觉边缘确实具有 - 即连接 - 一个简单的示例将返回一个单独的 Line2D(它将由受影响的顶点确实具有的中心点组成)到渲染器。方法调用显然是:
vv.getRenderContext().setEdgeShapeTransformer(edgeTransform);
但是:这行不通。(也许是因为我做错了;缺乏教程的借口)无论尝试使“转换”方法返回,渲染器都只会得到空值。
第二种可能性是将顶点变换拆分为两个转换器。第一个转换器将使用以下方法仅设置基本顶点位置:
Transformer<String, Point2D> vertexPositionTransformer = new Transformer<String,Point2D>() {
@Override
public Point2D transform(String st) {
return new Point2D.Double();
};
第二个是可选的。它可用于更改顶点大小或任何想要形状看起来的东西。将需要位置变换顶点的位置,因为此变换器将覆盖位置集。
Transformer<String, Shape> vertexShapeTransformer = new Transformer<String, Shape>() {
@Override
public Shape transform(String st) {
return new Ellipse2D.Double();
};
现在可以实例化布局。它不会以 Graph 作为单个参数的默认方式构造,而是使用一个附加参数:vertexPositionTransformer。这看起来像:
StaticLayout<String, String> layout = new StaticLayout<String, String>(graph, vertexPositionTransformer);
在布局构造中转换边缘将自动将边缘端点设置为每个包含顶点的中心。
在代码示例中,我放弃了“转换”方法的内容,这当然会因目的而异。必须在将受它们影响的顶点和边添加到图形后才能使用“Transformer”类/对象。就是这样。请纠正不良风格和此类问题。我很高兴得到反馈。
问候
卢卡斯·科斯钦