因为最近要做的项目设计到可视化编程,先使用了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");
}
}