2010-02-01 74 views
1

我使用JUNG来制作网络图。我想根据其类型来设置顶点的形状。这些顶点是可以选择和着色的。为顶点到目前为止的代码是为下:JUNG:如何塑造可选顶点

class VertexColors extends PickableVertexPaintTransformer<Number> { 
    VertexColors(PickedInfo<Number> pi) { 
     super(pi, Color.blue, Color.yellow); 
    } 

    public Paint transform(Number v) { 
     if (pi.isPicked(v.intValue())) return picked_paint; 

     return v.intValue()%2==1 ? Color.blue : Color.green; 
    } 
} 

我用下面的语句为每个顶点:

vv.getRenderContext().setVertexFillPaintTransformer(new VertexColors(vv.getPickedVertexState())); 

现在,我无法找到一个方法来塑造顶点,同时保持他们拣选和将标签顶点包裹起来。 请帮忙...

回答

3

所有你需要的是添加另一个Transformer,当它被选中时提供顶点形状。变形器应该根据顶点是否被“拾取”来选择形状。要获取拾取状态,您需要从可视化文件中获取一个PickedState对象。当选择被改变时,变压器将被询问形状并且顶点将被返回的形状更新。这里是一个如何做到这一点的例子:

final VisualizationViewer<Integer, String> vv = new 
    VisualizationViewer<Integer, String>(layout); 

// Transformer for cycling the vertices between three unique shapes. 
Transformer<Integer, Shape> vertexShape = new 
    Transformer<Integer, Shape>() { 

     private final Shape[] styles = { 
       new Ellipse2D.Double(-25, -10, 50, 20), 
       new Arc2D.Double(-15, -15, 30, 30, 30, 150, Arc2D.PIE) }; 

     @Override 
     public Shape transform(Integer i) { 
      // Choose a shape according to the "picked" state. 
      PickedState<Integer> pickedState = vv.getPickedVertexState(); 
      int shapeIndex = 0; 
      if (pickedState.isPicked(i)) { 
       shapeIndex = 1; 
      } 
      return styles[shapeIndex]; 
     } 
    }; 

vv.getRenderContext().setVertexShapeTransformer(vertexShape);