prefuse浅谈

来源:互联网 发布:岗顶 正大数据恢复 编辑:程序博客网 时间:2024/04/29 19:48

 因为最近要做的项目设计到可视化编程,先使用了dot,老板说太素了,要点精彩的,就让人推荐了个工具prefuse,下下来一看才知道这是一个Java语言的编程框架,以前没好好学Java,还好c++功底比较厚实,一个下午时间将Java“复习”了一遍,开始调试了一下prefuse里带的Demo,效果果然炫的可以啊。本来想好好学一下,去网上搜了一下资料,全是对Demo的引用,使用的确实不多,不过这也不能怪咱们网民,我去官网上看他们才出了一个初级用户手册,花了我一个上午将里面东西好好看了一下,基本上搞明白了是怎么回事,调试了里面的一个Example,功能效果确实不错。一下就是我的一点认识,希望可以对大家有所帮助。

 

因为这是一个可视化框架,所以使用时选择一个调试工具是比较好的选择,尤其像我这种Java基础不太牢靠的,当然在你下载的文件夹下面的readme里写的非常详细,我就是在他们推荐的Eclipse工具下调试了一下Demo。当然其他的可以直接导入工程的工具也是一个不错的选择,不知道好不好使,有兴趣的可以试一下。

 

既然是一个框架那就要搞清楚它到底有哪些可用的部分,哪些需要我们做的东西:用户手册里写的非常的详细,首先是它的框架图,可视化参考模型(visualization reference model)这个是本框架的开发者提供的一个东西,类似mvc,熟悉VC的可以类比MFC,只不过这里它更偏向于用户界面的开发。上传图片不容易,这里就略过了,有兴趣的朋友可以直接下手册来看。

 

强调一点的就是,我们输入的绘图数据都是要转化为prefuse内部数据的形式,graph,tree,table其中前两个都是后一个的一种形式,这个过程是prefuse内部专门的类转换的,再这里提出就是提醒大家在使用的时候段看看它提供的Java文档,少走弯路。

 

接下来就是介绍这个框架能用的东西,所有能用的东西都存在prefuse的src包里,使用的时候将这个文件夹里的东西带上就可以了,剩下的就是Java编程的东西了,我没这个发言权,有兴趣的大家可以自己研究。

 

现在我将例子程序代码粘上:这是一个社会网络的绘制过程。当然导入的包视你的程序而定,注意导对了就可以了,我图省事就导入的比较多。里面加了我的一部分注释,作为大家的参考

import java.io.*;

import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.RepaintAction;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.SizeAction;
import prefuse.action.layout.RandomLayout;
import prefuse.action.layout.graph.ForceDirectedLayout;
import prefuse.activity.Activity;
import prefuse.activity.ActivityAdapter;
import prefuse.activity.ActivityListener;
import prefuse.controls.*;
import prefuse.data.Schema;
import prefuse.data.Graph;
import prefuse.data.io.*;
import prefuse.data.tuple.TupleSet;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.LabelRenderer;
import prefuse.util.ColorLib;
import prefuse.util.PrefuseLib;
import prefuse.util.force.DragForce;
import prefuse.util.force.ForceItem;
import prefuse.util.force.ForceSimulator;
import prefuse.util.force.NBodyForce;
import prefuse.util.force.SpringForce;
import prefuse.util.ui.BrowserLauncher;
import prefuse.visual.VisualItem;
import prefuse.visual.sort.ItemSorter;


public class Example{
 public static void main(String argv[])
 {
  //System.out.println("Hello world!");
  //第一步是将可视化化需要的数据读入prefuse内部的数据结构,此例选择的是内部的graph结构
  Graph graph=null;
  try{
   graph=new GraphMLReader().readGraph("data/socialnet.xml");//此步骤可能包括很多次的数据转换
  }catch(DataIOException e){
   e.printStackTrace();
   System.err.println("Erroe");
   System.exit(1);
  }
  System.out.println("The 1 step ending.");
  System.out.println("Begin the 2 step.");
  //创建一个可视化图的抽象概念(内部存储的数据结构)
  Visualization vis=new Visualization();//此结构包括原始数据域和新的可视化信息,如:x,y坐标,颜色,大小
  vis.add("graph",graph);
  System.out.println("The 2 step ending.");
  System.out.println("Begin the 3 step.");
  //render和render工厂,用来传递数据
  LabelRenderer r=new LabelRenderer("name");//使用name来创建带有标签的节点
  r.setRoundedCorner(8,8);
  
  vis.setRendererFactory(new DefaultRendererFactory(r));//决定图形怎么画的主要工具
  System.out.println("The 3 step ending.");
  System.out.println("Begin the 4 step.");
  //数据处理动作,高于前面的visualization处理
  int[] palette= new int[]{
    ColorLib.rgb(255,180,180),ColorLib.rgb(190, 190, 255)
  };
  DataColorAction fill=new DataColorAction("graph.nodes","gender",Constants.NOMINAL,VisualItem.FILLCOLOR,palette);
  
  ColorAction text=new ColorAction("graph.nodes",VisualItem.TEXTCOLOR,ColorLib.gray(0));
  
  ColorAction edges=new ColorAction("graph.edges",VisualItem.STROKECOLOR,ColorLib.gray(200));
  
  ActionList color=new ActionList();//用来将前面的数据处理动作集合在一起
  color.add(fill);
  color.add(text);
  color.add(edges);
 
  ActionList layout=new ActionList(Activity.INFINITY);
  layout.add(new ForceDirectedLayout("graph"));
  layout.add(new RepaintAction());
  vis.putAction("color",color);
  vis.putAction("layout",layout);
  
  System.out.println("The 4 step ending.");
  System.out.println("Begin the 5 step.");
  
  //显示和交互控制
  Display display=new Display(vis);//显示可视化数据
  display.setSize(720,500);
  display.addControlListener(new DragControl());
  display.addControlListener(new PanControl());
  display.addControlListener(new ZoomControl());
  System.out.println("The 5 step ending.");
  System.out.println("Begin the 6 step.");
  //显示出可视化效果
  JFrame frame=new JFrame("prefuse example");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.add(display);
  frame.pack();//窗口中布局组件
  frame.setVisible(true);
  vis.run("color");
  vis.run("layout");
  
 }
}

原创粉丝点击