代码之家  ›  专栏  ›  技术社区  ›  theomega

JUNG(Java图形):如何防止顶点和边缘标签重叠?

  •  6
  • theomega  · 技术社区  · 15 年前

    我正在使用 Jung 绘制图表(我的意思是图表而不是图表!)。问题是顶点和边缘标签与顶点和边缘重叠。这导致了奇怪的图形。这个问题并不局限于特定的布局算法(尽管我一直在使用frlayout)。

    有没有可能告诉荣格防止这些重叠?我希望这已经实现了,唯一的问题是找到正确的选择!

    5 回复  |  直到 9 年前
        1
  •  5
  •   JimN    15 年前

    (以下答案假设Jung2;我不熟悉Pre-Jung2)。

    容格的一个优点是它非常可扩展,并且很容易扩展。Jung允许您插入各种转换器(简单的渲染属性)、渲染器(更复杂的渲染)等,以便在默认值不太正确时自定义行为。这些通常安装在renderContext上(可以从可视化查看器中获得)。

    另一方面,它的缺点是它的复杂性和缺乏像样的文档。如果你要做任何中度到重度的定制,你需要深入了解荣格的来源。

    例如,可以通过插入新的顶点标签渲染器(renderer.vertex label接口)自定义顶点标签渲染。例如,可以实例化basicVertexLabelRenderer并指定不同的位置(北、西、中等)。如果您愿意将形状更改为大于该圆的形状,可以将标签放在中间(为此,请安装自己的顶点形状转换器——Transformer的一个实例)。或者,您可以创建这个接口的自定义实现,它在标签文本下呈现一个背景。

    您还可以安装自己调整过的renderer.edge label版本(请参见Jung的basicedgelabelrenderer),以自定义边缘标签的位置。

        2
  •  7
  •   Emaad Ahmed Manzoor    14 年前

    只需设置标签偏移:

    vv.getRenderContext().setLabelOffset(20);
    

    在哪里? VV型 是你的 可视化查看器 对象。

        3
  •  6
  •   John    15 年前

    顺便说一句,如果你真的想改变颜色,起初它似乎是一个主要的痛苦。但我最近发现了这个小把戏:

    Transformer labelTransformer = new ChainedTransformer<String,String>(new Transformer[]{
                new ToStringLabeller<String>(),
                new Transformer<String,String>() {
                public String transform(String input) {
                    return "<html><font color=\"yellow\">"+input;
                }}});
    
    context.setVertexLabelTransformer(labelTransformer);
    
        4
  •  2
  •   ldog    15 年前

    我认为这就是它的实现方式,代码的作者可能并不认为这是一个问题。Jung图书馆是开放源码的,因此欢迎您根据需要对其进行更改。

    如果您不想更改代码,一个简单的修复方法就是简单地更改标签的颜色,使它们与边缘不同。

        5
  •  1
  •   Jiyeh    10 年前

    我遇到了同样的边缘标签重叠问题。我用来定位边缘标签的快速而肮脏的解决方案是在字符串值中填充一定长度的空白。

    //pad some white spaces to value of edge when adding edges to the graph
    graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2);
    

    它可以避免边缘标签在中心处的模糊和重叠,尤其是在构建二分图时。希望这能帮助你们中的一些人!