本人在使用Extjs时,用到AmChart(flash版本)来作图,开始做的时候我用ajax请求后,把结果替换 flashVars中的chart_data的数值,以为能够实现动态刷新的效果,可是界面没有任何改变,于是我使用重绘的方式实现了,但刷新的效果,界面总是一闪一闪的,不是很理想。后来我无意中发现了一种非常简单好用的方式,居然实现了。现分享出来。
首先,需要在ExtJS界面中创建一个flash模块,如下
createFlashChart: function() {
var me = this;
me.flashchart = {
id: 'flashchart',
xtype: 'flash',
stateful: true,
url: 'resources/flashline.swf',
EXPRESS_INSTALL_URL: 'resources/flash/expressInstall.swf',
flashVars: {
path: "resources/flash/",
data_file: "chart/getRtValue.shtml",
settings_file: "resourcesartsetartsetting.xml"
},
flashParams: {
bgcolor: "#0000ff",
wmode: "transparent",
menu: "false"
}
}
},
这里面包含一些swf文件,amline.swf是amchart中的直线模板,可以在文档中下载,expressInstall.swf可以在网上下载,path: "resources/flash/"设置的是amchart的模板库位置,data_file: "chart/getRtValue.shtml"设置的是我请求的数据URL,settings_file: "resources/ch
artset/ch
artsetting.xml" 设置的是图表样式文档。
然后,你需要在你的样式文档chartsetting.xml中设置如下内容,代表刷新频率
<reload_data_interval>3</reload_data_interval>
接着,你需要后台方法来获取数据,我这里使用的spring3MVC,返回的数据是xml文件,我先封装了一个转换map成xml的类,如下
package com.fly.util;
import java.util.List;
import java.util.Map;
/**
* @作用 数据转换类
* @author Fly
*/
public final class SystemUtil {
public static String parseToXml(List<Map<String, Object>> mapList, String series, String[] graphs) {
StringBuilder result = new StringBuilder("<?xml version='1.0' encoding='UTF-8'?><chart><series>");
for (int i = 0; i < mapList.size(); i++) {
Object o = mapList.get(i).get(series);
result.append("<value xid='").append(i).append("'>").append(o).append("</value>");
}
result.append("</series><graphs>");
for (int j = 0; j < graphs.length; j++) {
result.append("<graph gid='").append(j).append("'>");
for (int i = 0; i < mapList.size(); i++) {
Object o = mapList.get(i).get(graphs[j]);
result.append("<value xid='").append(i).append("'>").append(o).append("</value>");
}
result.append("</graph>");
}
result.append("</graphs></chart>");
return result.toString();
}
public static List getRtMapList(List<Map<String, Object>> mapList, Map<String, Object> map) {
if (mapList.size() > 100) {
mapList.remove(0);
}
mapList.add(map);
return mapList;
}
}
这里面有两个函数,第一个函数是把map装换成xml的方法,它有三个参数,第一个是传递进来的map,第二个参数x轴的变量名,第三个是y轴的数据值。
第二个函数的意思就是当数据的长度大于100的时候,去掉第一个数据,重新加载进来一个数据。
有了这个类后,你就可以写controller类的方法了。如下
@RequestMapping(value = "chart/getRtValue")
@ResponseBody
public String getRtValue(HttpSession session) {
Test1 t1 = getTest1Info(session);
int tp = t1.getTpId();
Test1 t2 = getTest2Info(session);
int rp = t2.getpId();
if (chartValues == null) {
long endtime = (new Date()).getTime() / 1000;
long starttime = endtime - 48 * 3600;
chartValues = chartService.getHisValue(tp, rp, starttime, endtime);
}
Map<String, Object> map = chartService.getRtValue(tp, rp);
chartValues = SystemUtil.getRtMapList(chartValues, map);
return SystemUtil.parseToXml(chartValues, "datatime", new String[]{"tp", "rp"});
}
这个方法中的@RequestMapping(value = "chart/getRtValue") 的value就是extjs中flash模块data_file对应的地址。chartValues是一个储存数据数据的全局map类list,如果这个数据为空的话,我就取一段历史数据加载进来,如果不为空就直接加载当前最新值。chartService是我封装的获取数据的数据业务。你可以在这里面根据自己的需求封装数据,但最终需要利用SystemUtil.parseToXml方法,转换成xml类型数据。当然amchart还支持csv数据格式。