gpt4 book ai didi

java - JUNG 中的顶点/节点显示在窗口外

转载 作者:行者123 更新时间:2023-12-04 05:06:21 25 4
gpt4 key购买 nike

我想我的问题最好用下图来描述。

enter image description here

我怎样才能告诉 JUNG 把所有东西都放在可见区域?

这是我的 VertexShapeTransformer (斯卡拉)

vv.getRenderContext().setVertexShapeTransformer(
new org.apache.commons.collections15.Transformer[String,java.awt.Shape]() {
def transform(label: String): java.awt.Shape = {
val longest_name = label.length
val width = longest_name * 10.0 // 12.0 is approx size of letter
val circle = new java.awt.geom.Ellipse2D.Double(-(width/2), -12.5, width, 25);
circle
}
})

当我删除它时,默认的小圆圈适合窗口,但顶点标签仍然不在窗口中。

最佳答案

我找到了解决方案。对于 vv: VisualizationViewer[String, String] ,以下函数更新布局器算法(scala 代码)。
它调用布局器上的松弛器(如果它支持松弛),然后重新排列顶点。 layout.setLocation为每个顶点调用函数,以确保它位于可打印的屏幕区域中。

  /**
* change the graph layouter
* with fancy animation
*/
def changeJUNGLayout(layout: jung.algorithms.layout.AbstractLayout[String, String]): Unit =
{

layout.setSize(vv.getSize())

assert(vv.getModel().getRelaxer() eq null)
if(layout.isInstanceOf[edu.uci.ics.jung.algorithms.util.IterativeContext]){
val relaxer: jung.algorithms.layout.util.Relaxer
= new jung.algorithms.layout.util.VisRunner(
layout.asInstanceOf[edu.uci.ics.jung.algorithms.util.IterativeContext])
relaxer.stop()
relaxer.prerelax()
}

{
import collection.JavaConversions._
val vs : Iterable[String] = layout.getGraph().getVertices()
for (v <- vs){
//println(v+" "+layout.getX(v)+" "+layout.getY(v))
val minX = v.length()*5.0
val maxX = vv.getSize().getWidth() - minX
val X = layout.getX(v)
val newX = if (X < minX) minX else if (X > maxX) maxX else X
val minY = 12.5
val maxY = vv.getSize().getHeight() - minY
val Y = layout.getY(v)
val newY = if (Y < minY) minY else if (Y > maxY) maxY else Y
layout.setLocation(v, newX, newY)
}
}

val staticLayout: jung.algorithms.layout.Layout[String, String] =
new jung.algorithms.layout.StaticLayout[String, String](jung_graph, layout)

val lt: jung.visualization.layout.LayoutTransition[String,String] =
new jung.visualization.layout.LayoutTransition[String,String](vv, vv.getGraphLayout(),
staticLayout)
val animator = new jung.visualization.util.Animator(lt);
animator.start();


vv.repaint();
}

关于java - JUNG 中的顶点/节点显示在窗口外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com