2012-10-15 14 views
7

Sono bloccato al momento con la libreria Java Jung.vertice colorazione Jung con valore

Visualizzazione di vertici e spigoli, solo non riesco a trovare alcuna funzione per la colorazione dei vertici di cui ho bisogno con il valore dei vertici e non con il mouse.

import edu.uci.ics.jung.algorithms.layout.FRLayout; 
import edu.uci.ics.jung.algorithms.layout.Layout; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.visualization.BasicVisualizationServer; 
import edu.uci.ics.jung.visualization.decorators.PickableVertexPaintTransformer; 
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; 
import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer; 
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JFrame; 

import org.apache.commons.collections15.Transformer; 
import org.apache.commons.collections15.functors.ConstantTransformer; 

public class Design { 
    public Graph<String, Integer> g; 
    public Design() {  

     this.g = ProjectTools.readNet("SmallTown.net"); 
    } 

    public static <Paint> void main(String[] args) { 
     Design sgv = new Design(); 
     Layout<Integer, String> layout = new FRLayout(sgv.g); 
     layout.setSize(new Dimension(800,800)); 
     BasicVisualizationServer<Integer, String> vv = 
      new BasicVisualizationServer<Integer, String>(layout); 

     Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() { 
      public Paint transform(Integer i) { 
       return (Paint) Color.GREEN; 
      } 
     }; 

     vv.setPreferredSize(new Dimension(850,850)); 
     vv.getRenderContext().setVertexLabelRenderer(new DefaultVertexLabelRenderer(Color.green)); 
     vv.getRenderContext().setEdgeDrawPaintTransformer(new ConstantTransformer(Color.white)); 
     vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f))); 

     vv.getRenderContext().setVertexFillPaintTransformer((Transformer<Integer, java.awt.Paint>) vertexPaint); 
     vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow)); 

     vv.setBackground(Color.gray); 
     vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>()); 
     vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 


     JFrame frame = new JFrame("Projet Algo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(vv); 
     frame.pack(); 
     frame.setVisible(true);  
    } 
} 

mia resa: Vertices and edges

risposta

4

Vedo due possibili problemi; chiami il numero setVertexFillPaintTransformer due volte e il numero BasicVisualizationServer non sembra che piaccia allo DefaultModalGraphMouse.

Prova questa versione:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Paint; 

import javax.swing.JFrame; 

import org.apache.commons.collections15.Transformer; 
import org.apache.commons.collections15.functors.ConstantTransformer; 

import edu.uci.ics.jung.algorithms.layout.FRLayout; 
import edu.uci.ics.jung.algorithms.layout.Layout; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.visualization.VisualizationViewer; 
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse; 
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; 
import edu.uci.ics.jung.visualization.picking.PickedInfo; 
import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer; 
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; 

public class Design { 
    public Graph<Integer, String> g; 
    public Design() {  

     this.g = ProjectTools.readNet("SmallTown.net"); 
    } 

    private static class VertexPaintTransformer implements Transformer<Integer,Paint> { 

     private final PickedInfo<Integer> pi; 

     VertexPaintTransformer (PickedInfo<Integer> pi) { 
      super(); 
      if (pi == null) 
       throw new IllegalArgumentException("PickedInfo instance must be non-null"); 
      this.pi = pi; 
     } 

     @Override 
     public Paint transform(Integer i) { 
      Color p = null; 
      //Edit here to set the colours as reqired by your solution 
      if (i % 2 == 0) 
       p = Color.GREEN; 
      else 
       p = Color.RED; 
      //Remove if a selected colour is not required 
      if (pi.isPicked(i)){ 
       p = Color.yellow; 
      } 
      return p; 
     } 
    } 

    public static <Paint> void main(String[] args) { 
     Design sgv = new Design(); 
     Layout<Integer, String> layout = new FRLayout(sgv.g); 
     layout.setSize(new Dimension(800,800)); 
     VisualizationViewer<Integer, String> vv = new VisualizationViewer<Integer, String>(layout); 

     Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() { 

      @Override 
      public Paint transform(Integer i) { 
       if (i % 2 == 0) 
        return (Paint) Color.GREEN; 
       else 
        return (Paint) Color.RED; 
      } 
     }; 

     vv.setPreferredSize(new Dimension(850,850)); 
     vv.getRenderContext().setVertexLabelRenderer(new DefaultVertexLabelRenderer(Color.green)); 
     vv.getRenderContext().setEdgeDrawPaintTransformer(new ConstantTransformer(Color.white)); 
     vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f))); 

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

     DefaultModalGraphMouse graphMouse = new DefaultModalGraphMouse(); 
     graphMouse.setMode(edu.uci.ics.jung.visualization.control.ModalGraphMouse.Mode.PICKING); 
     vv.setGraphMouse(graphMouse); 

     vv.setBackground(Color.gray); 
     vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>()); 
     vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 


     JFrame frame = new JFrame("Projet Algo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(vv); 
     frame.pack(); 
     frame.setVisible(true);  
    } 
} 

ho repalced vostro Transformer con una nuova versione che supporta la selezione VertexPaintTransformer, rimosso il secondo uso di setVertexFillPaintTransformer e si swithced da un BasicVisualizationServer-VisualizationViewer modo da poter utilizzare una raccolta GraphMouse

enter image description here

ho avuto per deridere il tuo metodo ProjectTools#readNet() ma Ihope puoi vedere i colori Dispari, Pari e Selezionati.

È ora possibile modificare VertexPaintTransformer#transform() come richiesto

+0

Grazie per la risposta, ma il codice non funziona per la mia configurazione. Non voglio usare il mio mouse per colorare i punti. Voglio aggiungere punti a colori direttamente nel mio codice. – Daleksek

+0

@Daleksek "Non voglio usare il mio mouse per colorare i punti", ma tu dove utilizzi un "PickableVertexPaintTransformer" che implica che volevi selezionare i vertici. Ciononostante puoi ancora cambiare l'implementazione di 'VertexPaintTransformer # transform()' alle tue esigenze senza usare il mouse. Perché provi il codice e vedi cosa fa, dovresti ottenere vertici verdi e rossi alternati. – GrahamA

Problemi correlati