2012-10-15 32 views
7

Tôi đang kẹt vào lúc này với thư viện Java Jung.Đỉnh màu Jung với giá trị

Tôi hiển thị các đỉnh và cạnh, chỉ tôi không thể tìm thấy bất kỳ chức năng nào cho tô màu đỉnh mà tôi cần với giá trị của các đỉnh chứ không phải bằng chuột.

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

vẽ của tôi: Vertices and edges

Trả lời

4

tôi có thể thấy hai vấn đề có thể; bạn đang gọi số setVertexFillPaintTransformer hai lần và BasicVisualizationServer dường như không thích DefaultModalGraphMouse.

Hãy thử phiên bản này:

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

Tôi đã repalced Transformer với một phiên bản mới VertexPaintTransformer hỗ trợ lựa chọn, bạn loại bỏ việc sử dụng thứ hai của setVertexFillPaintTransformer và swithced bạn từ một BasicVisualizationServer-VisualizationViewer vì vậy tôi có thể sử dụng một chọn GraphMouse

enter image description here

tôi đã để thử phương pháp ProjectTools#readNet() của bạn nhưng Ihope bạn có thể thấy các màu Odd, Even và Selected.

Bây giờ bạn có thể thay đổi theo yêu cầu VertexPaintTransformer#transform()

+0

Cám ơn câu trả lời của bạn, nhưng mã của bạn không làm việc cho cấu hình của tôi. Tôi không muốn sử dụng chuột để tô màu các điểm. Tôi muốn thêm điểm vào màu trực tiếp trong mã của tôi. – Daleksek

+0

@ Daleksek "Tôi không muốn sử dụng chuột để tô màu các điểm" nhưng bạn sử dụng 'PickableVertexPaintTransformer' ngụ ý bạn muốn chọn đỉnh. Tuy nhiên, bạn vẫn có thể thay đổi việc triển khai 'VertexPaintTransformer # transform()' thành yêu cầu của bạn mà không cần sử dụng chuột. Tại sao bạn thử mã và xem những gì nó làm, bạn sẽ nhận được xen kẽ các đỉnh màu xanh lá cây và đỏ. – GrahamA

Các vấn đề liên quan