2012-02-19 46 views
5

如何在JUNG圖形可視化中使用自定義頂點標籤?如何在JUNG圖形可視化中添加自定義頂點標籤?

我在關注Jung 2.0 Tutorial,我發現setVertexLabelTransformer()可以用來標記頂點,但是據我所知,這些標籤是不能定製的。

例如,下面的代碼產生三個頂點,其頂點標籤1,2,4:

import edu.uci.ics.jung.algorithms.layout.CircleLayout; 
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.visualization.BasicVisualizationServer; 
import java.awt.Dimension; 
import javax.swing.JFrame; 

public class SimpleGraphView { 
    Graph<Integer, String> g; 

    public SimpleGraphView() {  
     g = new SparseMultigraph<Integer, String>(); 
     g.addVertex((Integer)1); 
     g.addVertex((Integer)2); 
     g.addVertex((Integer)4); 
    } 

    public static void main(String[] args) { 
     SimpleGraphView sgv = new SimpleGraphView(); 
     Layout<Integer, String> layout = new CircleLayout(sgv.g); 
     layout.setSize(new Dimension(800,800)); 
     BasicVisualizationServer<Integer,String> vv = 
      new BasicVisualizationServer<Integer,String>(layout); 
     vv.setPreferredSize(new Dimension(850,850)); 

     JFrame frame = new JFrame("Simple Graph View"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(vv); 
     frame.pack(); 
     frame.setVisible(true);  
    } 
} 

如何添加標籤,如「Q0」?

+1

請引用您正在關注的教程。另見[*初始線程*](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod 2012-02-19 16:41:08

+1

既然您已將'SparseMultigraph '的泛型定義爲'SparseMultigraph ',其中頂點的通用V爲整數,邊的泛型E爲String,因此每個頂點的標籤值都是整數,每個邊的標籤在字符串中。所以,如果你想通過名稱像q1,v2等每個頂點,使用通用V的字符串,所以你可以傳遞一個頂點名稱,像這樣'g.addVertex(「q1」);' – ecle 2012-02-19 18:04:11

+0

要更改默認頂點標籤轉換器在JUNG呈現上下文中,搜索關鍵字'getRenderContext()。setVertexLabelTransformer' – ecle 2012-02-19 18:22:04

回答

5

既然你已經定義的SparseMultigraph<V, E>的仿製藥SparseMultigraph<Integer, String>其中通用V頂點作爲整數和邊緣的通用é爲String,因此每個頂點的標籤值是IntegerString每條邊的標籤。所以,如果你想要像Q1,V2等的名字每個頂點,使用String仿製V,這樣你就可以通過一個頂點的名字像這樣g.addVertex("q1");

3

如果你有一個節點一個自定義類,我會給出一個來自我的項目的例子。我有一類節點是這樣的:

public class Node 
{ 

public long tweetId = 0L; 
public long nodeId = 0L; 
public String screenName = ""; 
public Date reTweetDate = new Date(); 
public boolean isMainNode = false; 
public int size = 0; 

public Node() 
{ 
} 

} 

//你只需要重寫變換象下面這樣:

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

        return ((Node)v).screenName; 
       }}); 

//它會顯示在屏幕名屬性作爲標籤,在每個節點圖形。 //我希望這是你正在尋找的。

相關問題