图表不使用新的CN1aChartEngine库呈现 [英] Chart does not render with the new CN1aChartEngine library

查看:53
本文介绍了图表不使用新的CN1aChartEngine库呈现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是代码:

public Component getCombinedTemperatureChart(Context context) {

    /**
     *  Title for each line 
     */
    String[] titles = new String[]{"Temp 1", "Temp 2"};

    /**
     *  x-axis values
     */
    List<double[]> x = new ArrayList<double[]>();
    for (int i = 0; i < titles.length; i++) {
        x.add(new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
    }
    /**
     *  Value sets
     */
    List<double[]> values = new ArrayList<double[]>();
    values.add(new double[]{12.3, 12.5, 13.8, 16.8, 20.4, 24.4, 26.4, 26.1, 23.6, 20.3, 17.2,
        13.9});
    values.add(new double[]{9, 10, 11, 15, 19, 23, 26, 25, 22, 18, 13, 10});
    /**
     *  Colors and Styles for renderer
     */
    int[] colors = new int[]{Color.GREEN, Color.rgb(200, 150, 0)};
    PointStyle[] styles = new PointStyle[]{PointStyle.CIRCLE, PointStyle.DIAMOND};

    XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
    renderer.setPointSize(5.5f);
    int length = renderer.getSeriesRendererCount();
    for (int i = 0; i < length; i++) {
        XYSeriesRenderer r = (XYSeriesRenderer) renderer.getSeriesRendererAt(i);
        r.setLineWidth(5);
        r.setFillPoints(true);
    }
    setChartSettings(renderer, "Weather data", "Month", "Temperature", 0.5, 12.5, 0, 40,
            Color.LTGRAY, Color.LTGRAY);

    renderer.setXLabels(12);
    renderer.setYLabels(10);
    renderer.setShowGrid(true);
    renderer.setXLabelsAlign(Paint.Align.CENTER);
    renderer.setYLabelsAlign(Paint.Align.RIGHT);

    XYValueSeries sunSeries = new XYValueSeries("Demo 1");
    sunSeries.add(1f, 35, 4.3);
    sunSeries.add(2f, 35, 4.9);
    sunSeries.add(3f, 35, 5.9);
    sunSeries.add(4f, 35, 8.8);
    sunSeries.add(5f, 35, 10.8);
    sunSeries.add(6f, 35, 11.9);
    sunSeries.add(7f, 35, 13.6);
    sunSeries.add(8f, 35, 12.8);
    sunSeries.add(9f, 35, 11.4);
    sunSeries.add(10f, 35, 9.5);
    sunSeries.add(11f, 35, 7.5);
    sunSeries.add(12f, 35, 5.5);
    XYSeriesRenderer lightRenderer = new XYSeriesRenderer();
    lightRenderer.setColor(Color.YELLOW);

    XYSeries waterSeries = new XYSeries("Demo 2");
    waterSeries.add(1, 16);
    waterSeries.add(2, 15);
    waterSeries.add(3, 16);
    waterSeries.add(4, 17);
    waterSeries.add(5, 20);
    waterSeries.add(6, 23);
    waterSeries.add(7, 25);
    waterSeries.add(8, 25.5);
    waterSeries.add(9, 26.5);
    waterSeries.add(10, 24);
    waterSeries.add(11, 22);
    waterSeries.add(12, 18);

    XYSeries waterSeries2 = new XYSeries("Demo 3");
    waterSeries2.add(1, 15);
    waterSeries2.add(2, 14);
    waterSeries2.add(3, 14);
    waterSeries2.add(4, 15);
    waterSeries2.add(5, 18);
    waterSeries2.add(6, 22);
    waterSeries2.add(7, 24);
    waterSeries2.add(8, 25);
    waterSeries2.add(9, 24);
    waterSeries2.add(10, 21);
    waterSeries2.add(11, 18);
    waterSeries2.add(12, 16);
    renderer.setBarSpacing(0.3);

    XYSeriesRenderer sunSeries1 = new XYSeriesRenderer();
    sunSeries1.setColor(0xff0011cc);
    sunSeries1.setChartValuesTextAlign(Paint.Align.CENTER);

    XYSeriesRenderer waterRenderer1 = new XYSeriesRenderer();
    waterRenderer1.setColor(0xff0099cc);
    waterRenderer1.setChartValuesTextAlign(Paint.Align.CENTER);

    XYSeriesRenderer waterRenderer2 = new XYSeriesRenderer();
    waterRenderer2.setColor(0xff9933cc);
    waterRenderer2.setChartValuesTextAlign(Paint.Align.RIGHT);

    XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);
    dataset.addSeries(0, sunSeries);
    dataset.addSeries(0, waterSeries);
    dataset.addSeries(0, waterSeries2);

    renderer.addSeriesRenderer(0, lightRenderer);
    renderer.addSeriesRenderer(0, waterRenderer1);
    renderer.addSeriesRenderer(0, waterRenderer2);
    renderer.setApplyBackgroundColor(true);
    renderer.setBackgroundColor(Color.argb(50, 250, 210, 190));

    waterRenderer1.setDisplayChartValues(true);
    waterRenderer1.setChartValuesTextSize(10);

    waterRenderer2.setDisplayChartValues(true);
    waterRenderer2.setChartValuesTextSize(10);

    ChartFactory.getLineChartView(context, dataset, renderer).setZoomRate(5f);

    ChartFactory.getLineChartView(context, dataset, renderer).getCurrentSeriesAndPoint();
    return ChartFactory.getLineChartView(context, dataset, renderer).getPeer();

}

此方法返回图表作为组件。我以以下形式调用此方法:

This method returns chart as component. I called this method in the form of:

chart =  demo.getCombinedTemperatureChart(context);
addComponent(BorderLayout.CENTER, chart);

使用较旧的库,图表可以正确显示,但是使用新的CN1aChartEngine库,出现以下异常:

With the older library the chart renders correctly but with the new library of CN1aChartEngine, I got this exception:

java.lang.NullPointerException
    at org.achartengine.chart.XYChart.draw(XYChart.java:374)
    at org.achartengine.GraphicalView.onDraw(GraphicalView.java:195)
    at org.achartengine.compat.View$Peer.run(View.java:208)
    at com.codename1.ui.Display$1.run(Display.java:775)
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
[Task Thread] 0:0:0,0 - java.lang.NullPointerException
[Task Thread] 0:0:0,1 - java.lang.NullPointerException

在调试时,当 form.show() getCombinedTemperatureChart(Context)时未调用时,会发生此异常上下文)方法返回图表组件。
我不明白为什么更新的CN1aChartEngine库会出现此异常。

While debugging I get that, this exception occurs when form.show() called not at the moment when the getCombinedTemperatureChart(Context context) method returns the chart component. I didn't get why this exception occurs with the updated CN1aChartEngine library. Little help would be nice.

推荐答案

好像您使用的是较旧的1.0.x版本(即使用双鱼座)。我已经复制了该问题(在该行中)并已解决。您可以在
https://github.com/shannah上下载最新版本。 /CN1aChartEngine/releases/tag/1.0.2

Looks like you're using the older 1.0.x line (i.e. using Pisces). I have reproduced the problem (in that line) and fixed it. You can download the latest at https://github.com/shannah/CN1aChartEngine/releases/tag/1.0.2

这篇关于图表不使用新的CN1aChartEngine库呈现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆