2017-05-23 89 views
1

我想使用Prefuse显示一个节点ID在节点内部的简单图,但这似乎比听起来更复杂。显示Prefuse节点字段

Graph g = new Graph(); 
for (int i = 0; i < 3; ++i) { 
    Node n1 = g.addNode(); 
    n1.setInt("label", 1); // I am trying to add a field in a node 
    Node n2 = g.addNode(); 
    Node n3 = g.addNode(); 
    g.addEdge(n1, n2); 
    g.addEdge(n1, n3); 
    g.addEdge(n2, n3); 
} 
g.addEdge(0, 3); 
g.addEdge(3, 6); 
g.addEdge(6, 0); 

// add visual data groups 
VisualGraph vg = m_vis.addGraph(GRAPH, g); 
m_vis.setInteractive(EDGES, null, false); 
m_vis.setValue(NODES, null, VisualItem.SHAPE, new Integer(Constants.SHAPE_STAR)); 

然而,似乎这一领域不存在,这是有道理的,因为我没有加入这一领域,但没有添加一个字段没有一个选项。我得到这个例外指n1.setInt("DEFAULT_NODE_KEY", 1)行:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at prefuse.data.Table.getColumn(Table.java:457) 
    at prefuse.data.Table.setInt(Table.java:1032) 
    at prefuse.data.tuple.TableTuple.setInt(TableTuple.java:215) 
    at prefuse.demos.AggregateDemo.initDataGroups(AggregateDemo.java:141) 
    at prefuse.demos.AggregateDemo.<init>(AggregateDemo.java:72) 
    at prefuse.demos.AggregateDemo.demo(AggregateDemo.java:182) 
    at prefuse.demos.AggregateDemo.main(AggregateDemo.java:176) 

我不知道如何在节点使用领域。我试图读取library's help,但我无法弄清楚。

回答

1

您可能正在寻找LabelRenderer。在下面的example,一个LabelRenderer以这样的方式构造,以使具有该标签GraphLib.LABEL,定义为"label"节点:使用相同的密钥,GraphLib.LABEL经由setString()

LabelRenderer r = new LabelRenderer(GraphLib.LABEL); 

包含Graph给出文本节点。例如,将根Node添加到Graph返回的GraphLib.getDiamondTree()被分配了密钥GraphLib.LABEL和值"0,0"

Node r = t.addRoot(); 
r.setString(LABEL, "0,0"); 

后来,当Visualization运行,渲染器将尝试使用文本从GraphLib.LABEL领域。

image

import java.awt.Dimension; 
import javax.swing.JFrame; 
import prefuse.Display; 
import prefuse.Visualization; 
import prefuse.action.ActionList; 
import prefuse.action.RepaintAction; 
import prefuse.action.assignment.ColorAction; 
import prefuse.action.layout.graph.ForceDirectedLayout; 
import prefuse.activity.Activity; 
import prefuse.controls.DragControl; 
import prefuse.controls.PanControl; 
import prefuse.controls.ZoomControl; 
import prefuse.data.Graph; 
import prefuse.render.DefaultRendererFactory; 
import prefuse.render.LabelRenderer; 
import prefuse.util.ColorLib; 
import prefuse.util.GraphLib; 
import prefuse.visual.VisualItem; 

/** @see https://stackoverflow.com/a/44274886/230513 */ 
public class Example { 

    private static final int W = 640; 
    private static final int H = 480; 

    public static void main(String[] argv) { 

     // -- 1. create the data ------------------------------------------------ 
     Graph graph = GraphLib.getDiamondTree(3, 2, 1); 

     // -- 2. the visualization -------------------------------------------- 
     // add the graph to the visualization as the data group "graph" 
     // nodes and edges are accessible as "graph.nodes" and "graph.edges" 
     Visualization vis = new Visualization(); 
     vis.add("graph", graph); 
     vis.setInteractive("graph.edges", null, false); 

     // -- 3. the renderers and renderer factory --------------------------- 
     LabelRenderer r = new LabelRenderer(GraphLib.LABEL); 
     r.setRoundedCorner(8, 8); // round the corners 

     // create a new default renderer factory 
     // return our name label renderer as the default for all non-EdgeItems 
     // includes straight line edges for EdgeItems by default 
     vis.setRendererFactory(new DefaultRendererFactory(r)); 

     // -- 4. the processing actions --------------------------------------- 
     ColorAction fill = new ColorAction("graph.nodes", 
      VisualItem.FILLCOLOR, ColorLib.rgb(200, 200, 255)); 
     // use black for node text 
     ColorAction text = new ColorAction("graph.nodes", 
      VisualItem.TEXTCOLOR, ColorLib.gray(0)); 
     // use light grey for edges 
     ColorAction edges = new ColorAction("graph.edges", 
      VisualItem.STROKECOLOR, ColorLib.gray(200)); 

     // create an action list containing all color assignments 
     ActionList color = new ActionList(); 
     color.add(fill); 
     color.add(text); 
     color.add(edges); 

     // create an action list with an animated layout 
     ActionList layout = new ActionList(Activity.INFINITY); 
     layout.add(new ForceDirectedLayout("graph")); 
     layout.add(new RepaintAction()); 

     // add the actions to the visualization 
     vis.putAction("color", color); 
     vis.putAction("layout", layout); 

     // -- 5. the display and interactive controls ------------------------- 
     Display d = new Display(vis) { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(W, H); 
      } 
     }; 
     d.setSize(W, H); // set display size 
     d.pan(W/2, H/2); // pan to center 
     d.addControlListener(new DragControl()); 
     d.addControlListener(new PanControl()); 
     d.addControlListener(new ZoomControl()); 

     // -- 6. launch the visualization ------------------------------------- 
     JFrame frame = new JFrame("prefuse label example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(d); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); // show the window 

     vis.run("color"); 
     vis.run("layout"); 
    } 
} 
+0

答案是有点晚了,我理解了它自己,但还是感谢。 –