【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

前言

FineReport除了内置的图表外,还提供了第三方图表开发的API,方便进行个性化、第三方的图表开发。但是有些用户想使用内置图表一样的自动刷新功能,却不知如何实现。下面给出第三方图表如何实现图表自动刷新。

前提

已经开发好,可以使用的第三方图表。  (备注:第三方图表插件开发介绍:第三方图表实现自动刷新

下面介绍下在原有的第三方图表的基础上,添加监控刷新功能:

后台部分

添加自动刷新时间的设置,保存到模板中

(1)面板中添加设置自动刷新时间的组件,并将组件设置的值保存在chart类中

 

在面板中添加自动刷新时间组件
public abstract class ChartConfigPane <T extends Charts> extends ChartsConfigPane<T> {
    private JPanel northJpane = new JPanel();
    private JPanel centerJpane = new JPanel();
    private UILabel nameUILabel = new UILabel("图表名:");
    private UILabel demoUILabel = new UILabel("自定义组件:");
    private UILabel refreshTimeUILabel = new UILabel("刷新时间:");
    /**
     * 用户可以使用设计器封装好组件和自定义组件
     * 封装好组件直接使用
     * 自定义组件需要自定义,并实现UIObserver接口和相应方法
     * 建议用户都使用设计器提供的封装好组件(封装好的组件基本都是UI***)
     */
    //使用设计器中封装好的UI组件
    protected UITextField value = new UITextField();
    protected UISpinner autoRefreshTime = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
    //用户自定义组件
    protected CustomTextfield customTextArea = new CustomTextfield();
    protected ChartCollection chartCollection;
    public ChartConfigPane() //构造方法
    {
        this.setLayout(new BorderLayout());
        northJpane.setLayout(new GridLayout(4, 1, 10,10));
        northJpane.setLayout(new GridLayout(6, 1, 10,10));
        northJpane.add(nameUILabel);
        northJpane.add(value);
        northJpane.add(demoUILabel);
        northJpane.add(customTextArea);
        northJpane.add(refreshTimeUILabel);
        northJpane.add(autoRefreshTime);
        northJpane.setBorder(BorderFactory.createEmptyBorder(10,15,10,15));
        this.add(northJpane, BorderLayout.NORTH);
        this.add(centerJpane, BorderLayout.CENTER);
        this.setSize(200, 200);
        this.setVisible(true);
        //初始化所有组件后必须调用此方法为他们添加监听
        initAllListeners();
    }
 
  @Override
    protected void populate(ChartCollection collection, PieChart selectedChart) {
        this.chartCollection=collection;
        value.setText(selectedChart.getChartTitle());
        customTextArea.setText(selectedChart.getChartDescribe());
        autoRefreshTime.setValue(selectedChart.getRefreshTime());
    }
    @Override
    protected void update(ChartCollection collection, PieChart selectedChart) {
        selectedChart.setChartTitle(value.getText());
        selectedChart.setChartDescribe(customTextArea.getText());
        selectedChart.setRefreshTime((int) autoRefreshTime.getValue());
    }
}

(2)将chart类的的自动刷新时间保存到模版中,预览时,传到前台去

chart类保存自动刷新时间到模版中
public class PieChart extends Charts<NormalChartData> {
    private String chartTitle = "公共数据配置面板demo";
    private String chartDescribe = "描述";
    private int refreshTime = 0;
    private static final NumberFormat format = new DecimalFormat("##%");

    public String getChartTitle() {
        return chartTitle;
    }
    public void setChartTitle(String chartTitle) {
        this.chartTitle = chartTitle;
    }
    public String getChartDescribe() {
        return chartDescribe;
    }
    public void setChartDescribe(String chartDescribe) {
        this.chartDescribe = chartDescribe;
    }
    @Override
    public int getRefreshTime() {
        return refreshTime;
    }
    public void setRefreshTime(int refreshTime) {
        this.refreshTime = refreshTime;
    }
    /**
     * 比较和Object是否相等
     * @param ob 用 于比较的Object
     * @return 一个boolean值
     * 备注:不相等时,触发激活保存按钮
     */
    public boolean equals(Object ob) {
        return ob instanceof Chart && super.equals(ob)
                && ComparatorUtils.equals(((PieChart) ob).getChartTitle(), chartTitle)
                && ComparatorUtils.equals(((PieChart) ob).getChartDescribe(), chartDescribe)
                && ComparatorUtils.equals(((PieChart) ob).getRefreshTime(), refreshTime)
                ;
    }
    @Override
    public void writeXML(XMLPrintWriter xmlPrintWriter) {
        super.writeXML(xmlPrintWriter);
        xmlPrintWriter.startTAG("customChartDemo")
                .attr("chartTitle", getChartTitle())
                .attr("chartDescribe", getChartDescribe())
                .attr("refreshTime", getRefreshTime())
                .end();
    }
    @Override
    public void readXML(XMLableReader xmLableReader) {
        super.readXML(xmLableReader);
        if (xmLableReader.isChildNode()) {
            String tagName = xmLableReader.getTagName();
            if (tagName.equals("customChartDemo")) {
                setChartTitle(xmLableReader.getAttrAsString("chartTitle", "标题"));
                setChartDescribe(xmLableReader.getAttrAsString("chartDescribe", "描述"));
                setRefreshTime(xmLableReader.getAttrAsInt("refreshTime", 0));
            }
        }
    }
    /**
     * 读出字符串,然后传到前台
     * 注意:需要获取数据配置中的数据,使用getChartData()方法
     */
    @Override
    //tojson的时候注意用getChartData()方法获取当前数据集,然后自主拼接成json
    public JSONObject toJSON(Repository repo) throws JSONException {
        JSONObject jsonObject = JSONObject.create();
        jsonObject.put("series", seriesJSONArray())
                  .put("title", JSONObject.create().put("text", getChartTitle()));
        jsonObject.put("refreshTime", refreshTime);
        return jsonObject;
    }
    private JSONArray seriesJSONArray() throws JSONException {
        NormalChartData normalChartData = getChartData();
        int seriesLen = normalChartData.getSeriesCount();
        String radius = format.format(1.0 / seriesLen);
        //对系列循环
        JSONArray series = JSONArray.create();
        for (int index = 0; index < seriesLen; index++) {
            JSONObject wrapper = JSONObject.create()
                    .put("type", "pie")
                    .put("data", pointJSONArray(index)) //将每个系列值给data
                    .put("name", normalChartData.getSeries_array()[index].toString());//将系列名给系列
            if (seriesLen > 1) {
                JSONArray center = JSONArray.create()
                        .put(format.format((float) index / (seriesLen + 1) + 0.20))
                        .put("55%");
                wrapper.put("radius", radius)
                        .put("center", center);
            }
            series.put(wrapper);
        }
        return series;
    }
    private JSONArray pointJSONArray(int index) throws JSONException {
        NormalChartData normalChartData = getChartData();
        int categoriesLen = normalChartData.getCategoryLabelCount();
        JSONArray point = JSONArray.create();
        for (int i = 0; i < categoriesLen; i++) {
            JSONObject item = JSONObject.create();
            //将分类名给name
            String name = normalChartData.getCategory_array()[i].toString();
            item.put("name", name);
            if (normalChartData.getSeries_value_2D().length > 0) {
                //将点的值给data
                item.put("value", normalChartData.getSeries_value_2D()[index][i]);
            }
            point.put(item);
        }
        return point;
    }
    @Override
    public String getChartID() {
        return "ChartsPieWithCommenDataPane";
    }

}



 

前台部分

获取到后台传过来的自动刷新时间,通过ajax实现自动刷新

 

前台ajax实现自动刷新
/**
 * Created by richie on 16/1/29.
 */
EChartsFactory = function(options, $dom) {
    debugger;
    this.options = options;
    this.$dom = $dom;
    this.chartID = options.chartID;
    this.autoRefreshTime = options.chartAttr.refreshTime || 0;
    this.width = options.width || $dom.width();// 补充从dom获取.
    this.height = options.height || $dom.height();
    this.sheetIndex = options.sheetIndex || 0;
    this.ecName = options.ecName || '';
    FR.Chart.WebUtils._installChart(this, this.chartID);
};
EChartsFactory.prototype = {
    constructor : EChartsFactory,
    inits : function() {
        debugger;
        //后台传过来的数据或者样式都在 this.options.chartAttr中
        var ct = this.options.chartAttr;
        // function clear(str){return str.replace(/\s/g, '');}
        // var cleanct = clear(ct);
        // console.log(cleanct);
        // var json = JSON.parse(cleanct);
        this.newCharts = echarts.init(this.$dom[0], EChartsTheme[ct.theme]);
        this.newCharts.setOption(ct);
        this._autoRefresh(this.autoRefreshTime);
    },

    //自动刷新
    _autoRefresh: function (time) {
        if (time < 1) {
            return;
        }
        var self = this;
        setInterval(function () {
            var ID = FR.cjkEncode(self.chartID);
            var width = self.width || 0;
            var height = self.height || 0;
            var sheetIndex = self.sheetIndex;
            var ecName = self.ecName;
            if (FR.servletURL) {
                FR.ajax({
                    type: 'GET',
                    url: FR.servletURL + '?op=chartauto',
                    data: {
                        cmd: 'chart_auto_refresh',
                        sessionID: FR.SessionMgr.getSessionID(),
                        chartID: ID,
                        chartWidth: width,
                        chartHeight: height,
                        sheetIndex: sheetIndex,
                        ecName: ecName,
                        __time: new Date().getTime()
                    },
                    dataType: 'json',
                    success: function (chartRelateJS) {
                        var attrList = chartRelateJS.relateChartList;
                        for (var i = 0, len = attrList.length; i < len; i++) {
                            var chartID = FR.Chart.WebUtils._getChartIDAndIndex(attrList[i].id);
                            var chartSet = FR.ChartManager[chartID[0]];
                            if (chartSet && chartSet[chartID[1]]) {
                                var chartAttr = attrList[i].chartAttr;
                                self._setAutoRefreshData(chartSet[chartID[1]], chartAttr);
                            }
                        }
                    }
                });
            }
        }, time * 1000);
    },
    resize : function() {
        this.newCharts.resize();
    },
    refresh:function() {
    },
    refreshData:function(options){
    },
    //数据监控的刷新方式
    setData:function(options, aimation){
    }
};

示例源码

如果您希望看示例源码,您可以看这里:http://cloud.finedevelop.com:2015/users/mango/repos/plugins-democharts/browse

  • No labels