1.  把数据以点连线的方式在画面中显示

2.  数据按照数据的性别属性使用不同的颜色

3.  鼠标左键可以把图在画面中拖动

4.  鼠标右键可以把图放大或者缩小

5.  鼠标单击某个数据上,该数据点中心化显示(可以点击下试试就知道中心化显示)

6.  鼠标可以选中某个数据点进行任意位置的拖动,而在该点与其它点的关系保持不变

7.  在右下框输入a,则图中数据点中包含a的数据加亮显示

先把代码附上,注释中有讲解

package wjl;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.util.Iterator;import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.GroupAction;
import prefuse.action.ItemAction;
import prefuse.action.RepaintAction;
import prefuse.action.animate.ColorAnimator;
import prefuse.action.animate.PolarLocationAnimator;
import prefuse.action.animate.QualityControlAnimator;
import prefuse.action.animate.VisibilityAnimator;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.assignment.FontAction;
import prefuse.action.layout.CollapsedSubtreeLayout;
import prefuse.action.layout.graph.RadialTreeLayout;
import prefuse.activity.SlowInSlowOutPacer;
import prefuse.controls.ControlAdapter;
import prefuse.controls.DragControl;
import prefuse.controls.FocusControl;
import prefuse.controls.HoverActionControl;
import prefuse.controls.PanControl;
import prefuse.controls.ZoomControl;
import prefuse.controls.ZoomToFitControl;
import prefuse.data.Graph;
import prefuse.data.Node;
import prefuse.data.Table;
import prefuse.data.Tuple;
import prefuse.data.event.TupleSetListener;
import prefuse.data.io.DataIOException;
import prefuse.data.io.DelimitedTextTableReader;
import prefuse.data.io.GraphMLReader;
import prefuse.data.query.SearchQueryBinding;
import prefuse.data.search.PrefixSearchTupleSet;
import prefuse.data.search.SearchTupleSet;
import prefuse.data.tuple.DefaultTupleSet;
import prefuse.data.tuple.TupleSet;
import prefuse.render.AbstractShapeRenderer;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.EdgeRenderer;
import prefuse.render.LabelRenderer;
import prefuse.util.ColorLib;
import prefuse.util.FontLib;
import prefuse.util.ui.JFastLabel;
import prefuse.util.ui.JSearchPanel;
import prefuse.util.ui.UILib;
import prefuse.visual.VisualItem;
import prefuse.visual.expression.InGroupPredicate;
import prefuse.visual.sort.TreeDepthItemSorter;
import wjl.util.PreTable;public class RadialGraphView extends Display {private static final String tree = "tree";private static final String treeNodes = "tree.nodes";private static final String treeEdges = "tree.edges";private static final String linear = "linear";private LabelRenderer m_nodeRenderer;private EdgeRenderer m_edgeRenderer;private String m_label = "label";public RadialGraphView(Graph g, String label) {super(new Visualization());m_label = label;// -- 设置可视化 --m_vis.add(tree, g);m_vis.setInteractive(treeEdges, null, false);// -- 设置渲染 --m_nodeRenderer = new LabelRenderer(m_label);m_nodeRenderer.setRenderType(AbstractShapeRenderer.RENDER_TYPE_FILL);m_nodeRenderer.setHorizontalAlignment(Constants.CENTER);m_nodeRenderer.setRoundedCorner(8,8);m_edgeRenderer = new EdgeRenderer();DefaultRendererFactory rf = new DefaultRendererFactory(m_nodeRenderer);rf.add(new InGroupPredicate(treeEdges), m_edgeRenderer);m_vis.setRendererFactory(rf);// -- 处理行动 --// colorsItemAction nodeColor = new NodeColorAction(treeNodes);ItemAction textColor = new TextColorAction(treeNodes);m_vis.putAction("textColor", textColor);ItemAction edgeColor = new ColorAction(treeEdges,VisualItem.STROKECOLOR, ColorLib.rgb(200,200,200));FontAction fonts = new FontAction(treeNodes, FontLib.getFont("Tahoma", 10));fonts.add("ingroup('_focus_')", FontLib.getFont("Tahoma", 11));// recolorActionList recolor = new ActionList();
//        recolor.add(nodeColor);recolor.add(textColor);m_vis.putAction("recolor", recolor);// repaint 个人感觉repaint 没有用处 但是不知道为什么demo里面会有ActionList repaint = new ActionList();repaint.add(recolor);repaint.add(new RepaintAction());m_vis.putAction("repaint", repaint);// 动画油漆变化ActionList animatePaint = new ActionList(400);animatePaint.add(new ColorAnimator(treeNodes));animatePaint.add(new RepaintAction());m_vis.putAction("animatePaint", animatePaint);// 创建布局RadialTreeLayout treeLayout = new RadialTreeLayout(tree);//下面这条语句可以将一个圆改成一个扇形
//        treeLayout.setAngularBounds(-Math.PI/2, Math.PI);m_vis.putAction("treeLayout", treeLayout);CollapsedSubtreeLayout subLayout = new CollapsedSubtreeLayout(tree);m_vis.putAction("subLayout", subLayout);// 创建过滤和布局ActionList filter = new ActionList();filter.add(new TreeRootAction(tree));filter.add(fonts);filter.add(treeLayout);filter.add(subLayout);filter.add(textColor);
//        filter.add(nodeColor);filter.add(edgeColor);m_vis.putAction("filter", filter);// 动画过渡ActionList animate = new ActionList(1250);animate.setPacingFunction(new SlowInSlowOutPacer());animate.add(new QualityControlAnimator());animate.add(new VisibilityAnimator(tree));animate.add(new PolarLocationAnimator(treeNodes, linear));animate.add(new ColorAnimator(treeNodes));animate.add(new RepaintAction());m_vis.putAction("animate", animate);m_vis.alwaysRunAfter("filter", "animate");// ------------------------------------------------// 初始化setSize(600,600);setItemSorter(new TreeDepthItemSorter());addControlListener(new DragControl());addControlListener(new ZoomToFitControl());addControlListener(new ZoomControl());addControlListener(new PanControl());addControlListener(new FocusControl(1, "filter"));addControlListener(new HoverActionControl("repaint"));// ------------------------------------------------// 过滤图和进行布局m_vis.run("filter");//我也不清楚这个是做什么的demo里面有m_vis.addFocusGroup(linear, new DefaultTupleSet());m_vis.getGroup(Visualization.FOCUS_ITEMS).addTupleSetListener(new TupleSetListener() {public void tupleSetChanged(TupleSet t, Tuple[] add, Tuple[] rem) {TupleSet linearInterp = m_vis.getGroup(linear);if ( add.length < 1 ) return; linearInterp.clear();for ( Node n = (Node)add[0]; n!=null; n=n.getParent() )linearInterp.addTuple(n);}});//给数据改变颜色int[] palette = new int[] {      ColorLib.rgb(255,180,180), ColorLib.rgb(190,190,255), ColorLib.rgb(190,190,180)};DataColorAction fill = new DataColorAction(treeNodes, "gender",      Constants.NOMINAL, VisualItem.FILLCOLOR, palette);m_vis.putAction("shujucolor", fill);m_vis.run("shujucolor");//endSearchTupleSet search = new PrefixSearchTupleSet();m_vis.addFocusGroup(Visualization.SEARCH_ITEMS, search);search.addTupleSetListener(new TupleSetListener() {public void tupleSetChanged(TupleSet t, Tuple[] add, Tuple[] rem) {m_vis.cancel("animatePaint");m_vis.run("recolor");m_vis.run("animatePaint");}});}// ------------------------------------------------------------------------public static void main(String argv[]) throws DataIOException {String label = "name";Table nodes = new DelimitedTextTableReader().readTable("src/nodes");Table edges = new DelimitedTextTableReader().readTable("src/edges");Graph graph = new Graph(nodes, edges, false, "id", "sid", "tid");UILib.setPlatformLookAndFeel();JFrame frame = new JFrame("wjl 图显示");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setContentPane(demo(graph, label));frame.pack();frame.setVisible(true);}public static JPanel demo(String datafile, final String label) {Graph g = null;try {g = new GraphMLReader().readGraph(datafile);} catch ( Exception e ) {e.printStackTrace();System.exit(1);}return demo(g, label);}public static JPanel demo(Graph g, final String label) {        // 创建一个视图final RadialGraphView gview = new RadialGraphView(g, label);Visualization vis = gview.getVisualization();// 创建一个搜索 panel可以查询元素// 这段代码在自带的demo中有SearchQueryBinding sq = new SearchQueryBinding((Table)vis.getGroup(treeNodes), label,(SearchTupleSet)vis.getGroup(Visualization.SEARCH_ITEMS));JSearchPanel search = sq.createSearchPanel();search.setShowResultCount(true);search.setBorder(BorderFactory.createEmptyBorder(5,5,4,0));search.setFont(FontLib.getFont("Tahoma", Font.PLAIN, 11));final JFastLabel title = new JFastLabel("                 ");title.setPreferredSize(new Dimension(350, 20));title.setVerticalAlignment(SwingConstants.BOTTOM);title.setBorder(BorderFactory.createEmptyBorder(3,0,0,0));title.setFont(FontLib.getFont("Tahoma", Font.PLAIN, 16));gview.addControlListener(new ControlAdapter() {public void itemEntered(VisualItem item, MouseEvent e) {if ( item.canGetString(label) )title.setText(item.getString(label));}public void itemExited(VisualItem item, MouseEvent e) {title.setText(null);}});Box box = new Box(BoxLayout.X_AXIS);box.add(Box.createHorizontalStrut(10));box.add(title);box.add(Box.createHorizontalGlue());box.add(search);box.add(Box.createHorizontalStrut(3));JPanel panel = new JPanel(new BorderLayout());panel.add(gview, BorderLayout.CENTER);panel.add(box, BorderLayout.SOUTH);Color BACKGROUND = Color.WHITE;Color FOREGROUND = Color.DARK_GRAY;UILib.setColor(panel, BACKGROUND, FOREGROUND);return panel;}// ------------------------------------------------------------------------/*** 创建一个action 可以更换一个图的新中心*/public static class TreeRootAction extends GroupAction {public TreeRootAction(String graphGroup) {super(graphGroup);}public void run(double frac) {TupleSet focus = m_vis.getGroup(Visualization.FOCUS_ITEMS);if ( focus==null || focus.getTupleCount() == 0 ) return;Graph g = (Graph)m_vis.getGroup(m_group);Node f = null;Iterator tuples = focus.tuples();while (tuples.hasNext() && !g.containsTuple(f=(Node)tuples.next())){f = null;}if ( f == null ) return;g.getSpanningTree(f);}}/*** 设置node的形态*/public static class NodeColorAction extends ColorAction {public NodeColorAction(String group) {super(group, VisualItem.FILLCOLOR, ColorLib.rgba(255,255,255,0));add("_hover", ColorLib.gray(220,230));add("ingroup('_search_')", ColorLib.rgb(255,190,190));add("ingroup('_focus_')", ColorLib.rgb(198,229,229));}}/*** 设置文字的形态*/public static class TextColorAction extends ColorAction {public TextColorAction(String group) {super(group, VisualItem.TEXTCOLOR, ColorLib.gray(0));add("_hover", ColorLib.rgb(255,0,0));}}}

显示的结果: 

 

两个文件的内容

nodes

id name gender
0 aasda boy
1 bqweq nokonw
2 weas girl
3 asdad boy
4 ezsuy girl
5 fghyt boy

edges

id sid tid
0 0 1
1 0 2
2 1 3
3 4 5
4 0 4

转载于:https://www.cnblogs.com/MengYan-LongYou/p/3165328.html

prefuse学习(二)显示一张图相关推荐

  1. UIScrollerView当前显示3张图

    代码地址如下: http://www.demodashi.com/demo/11173.html WSLScrollView 功能描述:这是在继承UIView的基础上利用UIScrollerView进 ...

  2. OpenCV学习笔记——判断两张图的相似度

    判断两张图的相似度 方法 直方图对比法 ORB算法 实验 1.直方图对比法 参考如何使用OpenCV3直方图方法进行人脸相似度对比 因为我的环境是VS2010+OpenCV2.4.8,所以在原版的基础 ...

  3. python一张图学懂_【python系统学习07】一张图看懂字典并学会操作

    一张图get字典 一张图get字典的些许知识点 如果图中知识点描述过于概括,请看下列细文: 字典是什么 js的对象 说到字典,前端同学可以理解其为:对象.因为python中的字典和js中的对象长的不能 ...

  4. 真实诠释程序员日常的二十四张图【你中了几个】

    当你打开遗留代码时 扒下来项目后改了一行代码-- 程序员调试css样式的时候 当你的try catch 不起作用 产品经理对你说要兼容IE 没有ui给你提供大小设计的结果 没吃透需求直接开发的你 程序 ...

  5. ctf解题--当眼花的时候,会显示两张图(隐写)

    题目 不信? 你试试 解题链接: http://ctf5.shiyanbar.com/stega/final.png 解题 下载图片 wget http://ctf5.shiyanbar.com/st ...

  6. 华为昇腾系列开发入门教程二:开局一张图,手把手教你鉴“XX”

    编 | 章磊 啊,上篇文章发布后,得到了数以百亿计的隐形网友疯狂转发和点赞,鄙人甚至能YY出他们用鼠标摁下"

  7. 量化投资学习-13:一张图残酷的展现了庄家、量化交易者、散户的盈利空间的对比

    庄家.量化交易者.散户的盈利空间对比: 买入: 庄家(最先):在股票形态没有发生变化前,提前潜入,收集筹码 量化交易者(起涨开始时):股票的上涨形态形成,满足量化指标买入 散户(大幅上涨显著后):后知 ...

  8. 【JavaScript】JavaScript模拟实现面向对象一张图帮助你深刻理解原型链和原型对象

    文章目录 一.JavaScript模拟面向对象 1.函数是类 2.函数中各种变量的声明 3.关于函数内的this 小结:JavaScript中函数是什么? 4.练习:面向对象思想编写Complex类 ...

  9. 基于OpenLayer完成GIS一张图的开发

    一.OpenLayer简介 OpenLayers 是一个专门为WebGIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问. 使用OpenLayer API Open ...

最新文章

  1. Swift编程语言学习10—— 枚举属性监视器
  2. linux查找maven安装目录_Linux 安装 maven
  3. Hadoop每日一讨论整理版
  4. iOS开发:iPhone6、6 plus适配
  5. Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
  6. matlab画线不同颜色_怎样画线框图才有意义
  7. 加拿大第二大行TD Bank是如何践行科技战略的?
  8. POJ3750 小孩报数问题【模拟】
  9. Winows Phone 7 不温不火学习之《音乐播放示例》
  10. 使用计算机终端情况,朗威V1.0计算机终端保密检查系统
  11. win10+ubuntu16.04双系统下完全删除并重装ubuntu16.04
  12. 从小锁匠铺到工业造纸巨头,这家德国百年家族企业不断改写世界工程技术史 | 能动观察...
  13. excel文件因服务器未响应无法打开,excel打开显示兼容模式(未响应)
  14. 计算机后置音频接口,电脑后面音频插孔没声音怎么办?电脑后置插孔没声音的解决方案...
  15. 计算机中升序符号,电脑excel表格软件中的标点符号怎么快速替换
  16. Red hat查找命令所属的rpm包
  17. Redis Master/Salve Replication(主从复制模式)
  18. 【17.12.22.B】
  19. [Linux 配置Mysql] 在Linux上面 安装mysql 5.7数据库
  20. HP MSA存储 raid组坏了2块硬盘的数据恢复方法

热门文章

  1. 支付和清算就是信息流和资金流
  2. Delphi10 安装Graphics32
  3. KR C 传统C语言的函数定义
  4. php二维数组的取值与转换
  5. 8.ActionContext类与Servlet API解耦的访问方式
  6. Android 使用Adapter适配器模式实现无线轮播BannerView
  7. Echarts图标自适应问题(已解决)
  8. Xmind settings lower
  9. SSH Secure File Transfer上传文件错误:encountered 1 errors during the transfer解决办法
  10. CentOS-Samba服务