2010-02-01 72 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);