2010-02-01 22 views
1

J'utilise JUNG pour créer un diagramme de réseau. Je veux façonner les sommets en fonction de son type. Les sommets sont sélectionnables et colorés. Le code pour les sommets jusqu'à présent est comme sous:JUNG: comment former des sommets sélectionnables

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; 
    } 
} 

J'utilise la déclaration suivante pour chaque sommet:

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

Maintenant, je ne peux pas trouver un moyen de façonner les sommets tout en les gardant pickable et pour envelopper les sommets autour de leurs étiquettes. S'il vous plaît aider ...

Répondre

3

Tout ce que vous avez besoin est d'ajouter un autre Transformer qui fournit la forme de sommet quand il est sélectionné. Le Transformer doit choisir la forme en fonction du fait que le vertex est "sélectionné" ou non. Pour obtenir l'état sélectionné, vous devez obtenir un objet PickedState à partir de la visualisation. Lorsque la sélection est modifiée, le transformateur sera demandé pour la forme et les sommets seront mis à jour avec la forme retournée. Voici un exemple de la façon de procéder:

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);