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

时间:2010-02-16 13:13:02

标签: java prefuse

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

我的图表中有3种节点:

  1. 应用
  2. DATABASE
  3. INTERFACE
  4. 以下是我的包含图表的.xml文件的摘录

    <node id="AP-1">
    <data key="name">Application1</data>
    <data key="type">APPLICATION</data>
    </node>
    
    <node id="DB-1">
    <data key="name">Database1</data>
    <data key="type">DATABASE</data>
    </node>
    
    <node id="IT-1">
    <data key="name">Interface1</data>
    <data key="type">INTERFACE</data>
    </node>
    

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

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

      中读取.xml文件

      图g

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

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

2 个答案:

答案 0 :(得分:1)

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

E.g。在“国会”演示中(同样适用于表格的节点):

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

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

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

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

答案 1 :(得分:0)

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

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

  • 获取形状ID,getRawShape调用int stype = item.getShape()按形状操作设置DataShapeAction
  • 然后,掌握形状id,有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)以调用标准形状。