资讯专栏INFORMATION COLUMN

记一次prefuse应用实践(数据读入部分详细说明)

curried / 1949人阅读

摘要:数据读入介绍三种方式常见的格式数据的读入,详见源码里的文件因为其他我没看。直接输入数据主要介绍的部分。数据库读入见大神博客。

prefuse是一个Java可视化工具包。优点是功能强大,缺点是官网文档不全&代码没注释(要命)……
花了两天时间熟悉了操作并写完了自己的工程,专门来写篇文,希望能帮上某些掉坑的小伙伴www。

1、如何获取与使用

Github地址在这里,直接clone下来,运行build脚本,会获得三个jar包,把其中的prefuse.jar加入工程Java Build Path即可。

2、数据读入

介绍三种方式:

常见的xml格式数据的读入,详见prefuse源码里的GraphView.java文件(因为其他demo我没看)。

直接输入数据(主要介绍的部分)。

数据库读入(见大神博客)。

2.1 xml数据读入

没什么好说的,按照demo里的socialnet.xml来,如果需要有向图,可以在文件开头设置

2.2 直接输入读入

假设我们需要的做一张有向图,由点和边组成,点是名字(唯一name)。

先读入点:

HashMap nodesRow = new HashMap();

// 先创建表头,经测试不支持自定义类型
Schema n_sch = new Schema();
n_sch.addColumn("point", String.class);
n_sch.lockSchema();

// 然后根据表头生成表
Table nodes = n_sch.instantiate();

// 然后存入点的数据
for (int i = 0; i < points.length; i++) {
    // 很奇葩,需要先创建一个空行,然后返回行号
    int rid = nodes.addRow();
    // 然后根据行号和列名设置对应数值
    nodes.set(rid, "point", points[i]);
    // 记得把行号记下来,因为prefuse的边是用行号来唯一指定节点的,也很奇葩
    nodesRow.put(points[i], rid);
}

// 同理,创建边的表
Schema e_sch = new Schema();
e_sch.addColumn("from", int.class);
e_sch.addColumn("to", int.class);
Table arrows = e_sch.instantiate();

// 然后存入边的数据
for (int i = 0; i < edges.length; i++) {
    int rid = arrows.addRow();
    arrows.set(rid, "from", nodesRow.get(edges[i].from));
    arrows.set(rid, "to", nodesRow.get(edges[i].to));
}
3、展示

这部分就很简单了。大部分copy了大神博客里的代码,修改了一些,看看就好。

// 创建有向图(几个参数分别表示:点,边,是否有向,边的source列名,边的target列名)
Graph g = new Graph(nodes, arrows, true, "from", "to");

// 创建可视化对象
Visualization vis = new Visualization();
vis.add("graph", g);

// 设置点上面显示哪个字段的值,当然是points里的point列
LabelRenderer label = new LabelRenderer("point");
// 圆角
label.setRoundedCorner(10, 10);
vis.setRendererFactory(new DefaultRendererFactory(label));
// 设置点的颜色
ColorAction node_fill = new ColorAction("graph.nodes", VisualItem.FILLCOLOR, ColorLib.rgb(200, 200, 200));
ColorAction node_text = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR, ColorLib.rgb(0, 0, 0));
ColorAction node_other = new ColorAction("graph.nodes", VisualItem.STROKECOLOR, 0);
// 设置边的颜色
ColorAction edge_text = new ColorAction("graph.edges", VisualItem.TEXTCOLOR, ColorLib.rgb(0, 0, 0));
ColorAction edge_fill = new ColorAction("graph.edges", VisualItem.FILLCOLOR, ColorLib.rgb(20, 100, 100));
ColorAction edge_other = new ColorAction("graph.edges", VisualItem.STROKECOLOR, ColorLib.rgb(20, 100, 100));

// 颜色指令
ActionList color = new ActionList();
color.add(node_fill);
color.add(node_text);
color.add(node_other);
color.add(edge_text);
color.add(edge_fill);
color.add(edge_other);

// 画图指令
ActionList layout = new ActionList(Activity.INFINITY);
layout.add(new ForceDirectedLayout("graph"));
layout.add(new RepaintAction());

// 把指令告诉可视化对象
vis.putAction("color", color);
vis.putAction("layout", layout);

// 生成Java GUI对象
Display display = new Display(vis);
display.setSize(800, 600);
display.pan(250, 250);
display.addControlListener(new DragControl());
display.addControlListener(new PanControl());
display.addControlListener(new ZoomControl());
display.addControlListener(new WheelZoomControl());
display.addControlListener(new FocusControl(1));
display.addControlListener(new ZoomToFitControl());

// 在一个JFrame上显示出来
JFrame jf = new JFrame();
jf.setSize(800, 600);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(display);
// 记得运行画图指令
vis.run("color");
vis.run("layout");
// 最后设置为可见即可
jf.setVisible(true);
其他

这部分代码画画流程图肯定够了,其他更高深的功能兄弟们自己探♂索吧。我用不上所以没接着看下去……

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67788.html

相关文章

  • 一次基于vue的spa多页签实践经验

    摘要:然后类似一样我的命名是可以在页面的任何地方使用,如果你对具体的实现方法有兴趣,欢迎点击本文结尾的链接,去我的仓库上查看。 前言 最近收到一个这样的需求,要求做一个基于 vue 和 element-ui 的通用后台框架页,具体要求如下: 要求通用性高,需要在后期四十多个子项目中使用,所以大部分地方都做成可配置的. 要求做成脚手架的形式.可以 npm 安装 要求实现多页签,并且可以通过浏...

    ispring 评论0 收藏0
  • 一次基于vue的spa多页签实践经验

    摘要:然后类似一样我的命名是可以在页面的任何地方使用,如果你对具体的实现方法有兴趣,欢迎点击本文结尾的链接,去我的仓库上查看。 前言 最近收到一个这样的需求,要求做一个基于 vue 和 element-ui 的通用后台框架页,具体要求如下: 要求通用性高,需要在后期四十多个子项目中使用,所以大部分地方都做成可配置的. 要求做成脚手架的形式.可以 npm 安装 要求实现多页签,并且可以通过浏...

    张迁 评论0 收藏0
  • 一次 Laravel 应用性能调优经历

    摘要:为了一探究竟,于是开启了这次应用性能调优之旅。使用即时编译器和都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高或者更高的性能。 这是一份事后的总结。在经历了调优过程踩的很多坑之后,我们最终完善并实施了初步的性能测试方案,通过真实的测试数据归纳出了 Laravel 开发过程中的一些实践技巧。 0x00 源起 最近有同事反馈 Laravel 写的应用程序响应有点慢、20几个并...

    warkiz 评论0 收藏0
  • 一次Spring Batch完整入门实践

    摘要:什么是作为的子项目,是一款基于的企业批处理框架。首先,运行的基本单位是一个,一个就做一件批处理的事情。总结为我们提供了非常实用的功能,对批处理场景进行了完善的抽象,它不仅能实现小数据的迁移,也能应对大企业的大数据实践应用。 前言 本文将从0到1讲解一个Spring Batch是如何搭建并运行起来的。本教程将讲解从一个文本文件读取数据,然后写入MySQL。 什么是 Spring Batc...

    Baaaan 评论0 收藏0
  • 一次翻译站经历

    摘要:做这个记录之前,刚完成使用作为公司前端项目的持续交付工具的实践,打算写的教程前先把官方文档扒下来做个翻译站。在实践一番后,卡在不能频密调取翻译这块上,项目无法进行下去。 做这个记录之前,刚完成使用drone作为公司前端项目的持续交付工具的实践,打算写的教程前先把官方文档扒下来做个翻译站。在实践一番后,卡在不能频密调取google翻译这块上,项目无法进行下去。最后觉得经历的过程涉及的内容...

    seasonley 评论0 收藏0

发表评论

0条评论

curried

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<