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

标签 java scala jung

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

enter image description here

我如何告诉 JUNG 将所有内容都放在可见区域中?

这是我的VertexShapeTransformer(Scala)

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/

相关文章:

java - 在 Java 中实现 Scala 函数

用于可视化类似流程图的图表的 Java 图形库

java - 如何使用 JUNG 对绘图边缘进行动画处理

java - JUNG - 大图可视化

java - 使用 CorsFilter 和 spring security 时出现 Cors 错误

scala - 我想知道 scala 中的 list.contains() 和 set.contains() 哪个更快

Java 按二维数组文本文件中的名称和数字排序

scala - 尝试使用Shapeless递归将案例类转换为异构列表的怪异行为

java - 如何将字符串中的 UTF-8 替换为类似的拉丁字母?

java - 如何为我的数独游戏制作 GUI? ( Swing )