几年前(2007年?)我使用prefuse来显示呼叫数据记录。我考虑了prefuse,jung,jgraph和其他一些人,并选择了prefuse。起初有点难以将我的头包裹起来,但是一旦我熟悉它,它就非常容易(扩展)和使用起来很有趣。我想JUNG可以这么说,但我从未尝试过。
1)在prefuse中,添加自己的自定义渲染器以绘制平行边缘非常容易 - 您可以继承默认的EdgeRenderer并覆盖render()方法。不需要“基本数据级别更改”。如果您想将其视为MVC内容,那么这一切都在视图中。
2)这根本不是问题。有多种方法可以做到这一点:1)你可以有两个渲染器 - 一个用于绘制有向边,一个用于绘制无向边,它们可以正常工作,并适当地对边进行分组。 2)放置一个标志(在prefuse speak中的后备表元组中添加一个布尔列)以指示边缘是否被定向并根据该标志在EdgeRender中相应地跳过箭头绘制部分。
3)这非常容易
4)同上
5)最后一个prefuse版本是“prefuse beta release 2007.10.21”。我之前使用的那个,在动态添加或删除节点时可能存在竞争条件 - 我猜错了一些同步关键字。我通过确保在添加或删除节点时停止所有动画和操作(颜色,大小,布局)来解决这个问题 - 也不要忘记更新你的lucene索引(如果你使用它内置的lucene搜索引擎)。最新的一个应该解决这个种族问题,但我从来没有机会尝试过。
6)既然你提到了“多重标签”,我认为这不是“修改图形并重新绘制”的问题 - 只需要定制标签/边缘渲染器来绘制相关标签,这不是一个大问题。 。我也不认为这与5有关。
7)我并不感到惊讶,因为prefuse和JUNG对FruchtermanReingoldLayout的渲染是不同的 - 有一些因素可能会影响其中一个因素,即每个实现开始计算的起始节点,所以我不会担心这个问题。在prefuse中尝试不同的内置图形布局算法非常容易,因此您可以继续检查哪一个最接近您想要的内容。查看RadialLayout和BalloonTreeLayout的星形布局。 ForceDirectedLayout需要相当多的迭代才能使节点的位置“稳定”。请注意,不必显示这些迭代,因此您可以在后台运行它并呈现最终结果。
我没有使用JUNG所以我不能对此发表评论。
基于我对prefuse的经验,我强烈推荐它,因为非常好(恕我直言)经过深思熟虑的设计和组件之间的可靠性分离。杰弗里·希尔(prefuse作者)在那里做得很好。
如果你使用prefuse需要注意的事项(这些是我在使用prefuse时生动地记住的两个“痛苦的拇指”):
1)有一个错误,当缩小时,节点标签没有被适当地缩小,使得它溢出节点的边界框,当节点移动时将留下字体绘制工件,因为渲染器只清除并重绘节点边界内的东西框。 IIRC这是由AWT字体指标本身的错误引起的。解决方法是在标签和节点边界框之间留出足够的边距。
2)扩展内置布局时,您可能会遇到一个或两个“范围问题”,其中您要访问的超类成员被赋予私有属性而不是受保护,因此解决方案是要么修改库本身或创建一个没有继承的新类(这可能有点痛苦!)。我想你可以对其他一些java库说同样的话。不是每个人都有后见之明的好处吗? :)
自从你在一个月前(在我写这篇文章时)提出这个问题以来,我想知道你的决定是什么以及如果你继续实施它的结果。