通过PREFUSE库为Java显示节点的问题?
我正在使用PREFUSE库开发数据的图形视图。
我的图中有3种节点:
- 应用
- 数据库
- 接口
以下是我的包含图形的.xml文件的一些摘录
Application1 APPLICATION Database1 DATABASE Interface1 INTERFACE
我想展示上面的3差异。 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)以调用标准形状。