2012-12-06 5 views
0

사용자가 정점을 선택할 때만 정점 이름을 표시하려고했습니다. 모든 정점 이름을 표시 할 수 있지만 선택한 정점 이름을 표시하는 것이 좋습니다. 버텍스 등 선택에 대한 몇 가지 예를 발견했지만 실제로 코드에서 원하는 것을 구현할 수 없습니다. 정 노드에 선택된 노드 이름을 표시

final PickedState<String> pickedState = vv.getPickedVertexState(); 
    pickedState.addItemListener(new ItemListener() { 

     @Override 
     public void itemStateChanged(ItemEvent e) { 
      Object subject = e.getItem(); 
      if (subject instanceof String) { 
       String vertex = (String) subject; 
       if (pickedState.isPicked(vertex)) { 
        System.out.println("Vertex " + vertex 
          + " is now selected"); 
       } 
      } 
     } 
    }); 

이 그래서 내가 그들을 어떻게 결합 할 수 있습니다 : 나는 정점을 선택하는 방법은 다음과

vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() { 
     @Override 
     public String transform(Object v) { 
      return super.transform(v); 
     }}); 

: 모든 정점 이름을 표시하는 예를 들어, 나는이 코드 조각을 사용하고 있습니다? 선택한 정점 이름을 표시하고 싶습니다. 고맙습니다.

답변

2

당신은 정점은 여기 RenderContext

vv.getRenderContext().setVertexLabelTransformer(new VertexLabelTransformer(vv.getPickedVertexState())); 

VertexLabelTransformer 설정을 사용하여 다음

private static class VertexLabelTransformer implements Transformer<Integer,String>{ 
    private final PickedInfo<Integer> pi; 

    public VertexLabelTransformer(PickedInfo<Integer> pi){ 
     this.pi = pi; 
    } 

    @Override 
    public String transform(Integer t) { 
     if (pi.isPicked(t)) 
      return t.toString(); 
     else 
      return ""; 
    } 
} 

과를 선택한 경우 문자열을 반환 PickedInfo를 사용하는 Transformer를 작성하여이 작업을 수행 할 수 있습니다 전체 코드입니다

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.graph.SparseMultigraph; 
import edu.uci.ics.jung.graph.util.EdgeType; 
import edu.uci.ics.jung.visualization.VisualizationViewer; 
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse; 
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 = 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; 
      if (i % 2 == 0) 
       p = Color.GREEN; 
      else 
       p = Color.RED; 

      if (pi.isPicked(i)){ 
       p = Color.yellow; 
      } 
      return p; 
     } 
    } 

    private static class VertexLabelTransformer implements Transformer<Integer,String>{ 
     private final PickedInfo<Integer> pi; 

     public VertexLabelTransformer(PickedInfo<Integer> pi){ 
      this.pi = pi; 
     } 

     @Override 
     public String transform(Integer t) { 
      if (pi.isPicked(t)) 
       return t.toString(); 
      else 
       return ""; 
     } 
    } 


    @SuppressWarnings("unchecked") 
    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().setVertexLabelTransformer(new VertexLabelTransformer(vv.getPickedVertexState())); 


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

    public static Graph<Integer, String> readNet(String string) { 
     // Graph<V, E> where V is the type of the vertices 
     // and E is the type of the edges 
     Graph<Integer, String> g = new SparseMultigraph<Integer, String>(); 
     // Add some vertices. From above we defined these to be type Integer. 
     g.addVertex(1); 
     g.addVertex(2); 
     g.addVertex(3); 
     // Add some edges. From above we defined these to be of type String 
     // Note that the default is for undirected edges. 
     g.addEdge("Edge-A", 1, 2); // Note that Java 1.5 auto-boxes primitives 
     g.addEdge("Edge-B", 2, 3); 
     // Let's see what we have. Note the nice output from the 
     // SparseMultigraph<V,E> toString() method 
     System.out.println("The graph g = " + g.toString()); 
     // Note that we can use the same nodes and edges in two different graphs. 
     Graph<Integer, String> g2 = new SparseMultigraph<Integer, String>(); 
     g2.addVertex(1); 
     g2.addVertex(2); 
     g2.addVertex(3); 
     g2.addEdge("Edge-A", 1,3); 
     g2.addEdge("Edge-B", 2,3, EdgeType.DIRECTED); 
     g2.addEdge("Edge-C", 3, 2, EdgeType.DIRECTED); 
     g2.addEdge("Edge-P", 2,3); // A parallel edge 
     return g2; 

    } 
} 
+0

대단히 감사합니다. 이것이 내가 필요한 것입니다. –