通过PREFUSE库为Java显示节点的问题?

我正在使用PREFUSE库开发数据的图形视图。

我的图中有3种节点:

  1. 应用
  2. 数据库
  3. 接口

以下是我的包含图形的.xml文件的一些摘录

 Application1 APPLICATION   Database1 DATABASE   Interface1 INTERFACE  

我想展示上面的3差异。 3种差异的节点种类。 各种形状如下:

  1. 应用矩形
  2. 自定义形状的数据库(圆柱形状,通常用于表示数据库)
  3. 通过圈子接口

我先读了一个.xml文件

图g

Q1。 现在我如何区分数据组中的这3种节点。 我想我应该写谓词。 我已经阅读了prefuse的整个谓词和表达式手册,但是无法编写谓词来区分它们。 那么谓词是什么呢?

Q2。 如何指定我的自定义形状以及如何设置可以渲染我开发的自定义形状的渲染器?

为节点分配不同形状的范例是使用DataShapeAction

例如在“Congress”演示中(同样适用于Nodes as Tables):

 int[] shapes = new int[] { Constants.SHAPE_RECTANGLE, Constants.SHAPE_DIAMOND }; DataShapeAction shape = new DataShapeAction(group, "Senate", shapes); 

这根据“参议院”数据字段中的值为数据点分配不同的形状,即参议员是一个形状,国会议员是另一种形状,按某种顺序(在API中有各种控制,参见Constants.ORDINAL for一个例子)。

换句话说,您可能会使用“类型”数据字段来指示节点的节点类型,然后使用DataShapeAction指定不同的形状。

定义一个新的形状当然是可能的,但需要更多的修补。 我会尝试用更好的答案回复你,但我猜最简单的方法是编写自己的noderenderer子类,它能够绘制你想要的形状,然后可能扩展DataShapeAction来处理一些标记为您的新数据类型。 不过,希望之后会有更多相关信息。

您不需要谓词来指定形状。 实际上,为了绘制自定义形状,您必须子类化形状绘制渲染器ShapeRenderer 。 ShapeRenderer使用id号( int )区分形状。 这些整数在所有标准形状的结构Constants中 – 如bcr所写,例如Constants.SHAPE_RECTANGLE

内部prefuse调用ShapeRenderer的protected Shape getRawShape(VisualItem item)函数。 反过来,此函数调用ShapeRenderer中的其他内部函数以获取要绘制的形状。 例如:

  • 获取形状id, getRawShape调用int stype = item.getShape()由形状动作DataShapeAction设置
  • 然后,掌握手头的形状,有switch声明选择合适的形状来绘制

     switch ( stype ) { case Constants.SHAPE_NONE: return null; case Constants.SHAPE_RECTANGLE: return rectangle(x, y, width, width); case Constants.SHAPE_ELLIPSE: return ellipse(x, y, width, width); case Constants.SHAPE_TRIANGLE_UP: return triangle_up((float)x, (float)y, (float)width); ... 

为了绘制一些其他形状(自定义形状),您ShapeRenderer并提供自己的形状实现来绘制和覆盖getRawShape
如果您将形状ID识别为您自己的形状,则返回形状,否则在执行getRawShape调用super(item)以调用标准形状。