2012-12-06 54 views
0

我試圖僅在用戶選擇頂點時顯示頂點名稱。我可以顯示所有的頂點名稱,但最好爲我顯示選定的頂點名稱。我發現了一些關於選擇頂點等的例子......但在我的代碼中,實際上我無法實現我想要的東西。例如,以顯示所有頂點的名字,我使用這段代碼:在jung中顯示選定的節點名稱

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

這裏我該如何選擇一個頂點:

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

所以,我怎麼能結合他們?我只想顯示選定的頂點名稱。謝謝。

回答

2

您可以通過如果頂點選擇

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

,然後使用上RenderContext

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

這裏設置VertexLabelTransformer創建使用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

非常感謝你,這正是我所需要的 –

相關問題