2012-10-15 10 views
7

Utknąłem w tej chwili z biblioteką Jung Jung.Kolorowanie wierzchołka Junga z wartością

Wyświetlam wierzchołki i krawędzie, tylko nie mogę znaleźć żadnych funkcji do kolorowania wierzchołków, których potrzebuję przy wartości wierzchołków, a nie myszy.

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

Moja renderowania: Vertices and edges

Odpowiedz

4

Widzę dwa możliwe problemy; dzwonisz pod numer setVertexFillPaintTransformer dwa razy i BasicVisualizationServer nie wydaje ci się, że lubisz DefaultModalGraphMouse.

Spróbuj tej wersji:

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

Mam repalced swój Transformer z nową wersją VertexPaintTransformer obsługującym wybór, usunęła drugą wykorzystanie setVertexFillPaintTransformer i swithced Cię z punktu A BasicVisualizationServer do VisualizationViewer więc mogę używać zbieranie GraphMouse

enter image description here

miałem naśmiewanie się z metody ProjectTools#readNet(), ale mogę zobaczyć kolory nieparzyste, parzyste i wybrane.

Teraz można zmodyfikować VertexPaintTransformer#transform() jak wymaganych

+0

Dzięki za odpowiedź, ale kod nie działa na mojej konfiguracji. Nie chcę używać myszy do kolorowania punktów. Chcę dodać punkty do koloru bezpośrednio w moim kodzie. – Daleksek

+0

@Daleksek "Nie chcę używać myszy do kolorowania punktów", ale w przypadku używania 'PickableVertexPaintTransformer' oznacza to, że chciałeś wybrać wierzchołki. Mimo to wciąż możesz zmienić implementację 'VertexPaintTransformer # transform()' do swoich wymagań bez użycia myszy. Dlaczego próbujesz kodu i widzisz, co robi, powinieneś dostać naprzemiennie zielone i czerwone wierzchołki. – GrahamA

Powiązane problemy