2012-10-15 12 views
7

私は現在、JavaライブラリJungで悩んでいます。値を持つJungのカラーリング頂点

私は頂点とエッジを表示しますが、私は頂点の値で必要な頂点の色付けのための関数を見つけることができず、マウスではできません。

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

私のレンダリング: Vertices and edges

答えて

4

私は2つの可能性のある問題を見ることができます。 setVertexFillPaintTransformerを2回、BasicVisualizationServerにはDefaultModalGraphMouseのように表示されます。

このバージョン試してみてください:私はsetVertexFillPaintTransformerの二次利用を取り出して、私が使用することができますBasicVisualizationServerからVisualizationViewerにあなたをswithced、選択をサポートする新しいバージョンVertexPaintTransformerを使用してTransformerをrepalcedまし

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

を私が持っていた摘みGraphMouse

enter image description here

あなたのProjectTools#readNet()メソッドをモックするが、奇妙な、偶数と選択された色を見ることができます。

は今、あなたの答えのために必要な

+0

感謝としてVertexPaintTransformer#transform()を変更することができますが、あなたのコードは、私の設定では動作しません。私はマウスを使用してポイントを色づけしたくありません。自分のコードに色を直接追加する必要があります。 – Daleksek

+0

@Daleksek "私はマウスを使ってポイントを色づけしたくありませんが、" PickableVertexPaintTransformer "を使って頂点を選びたいとしています。それにもかかわらず、マウスを使わずに 'VertexPaintTransformer#transform()'の実装を要件に変更することはできます。なぜコードを試して、それが何であるかを見ると、緑と赤の頂点が交互に現れます。 – GrahamA

関連する問題