如何在不使用add()函数的情况下使用列表设置XYSeries的内容?

时间:2018-04-18 13:24:19

标签: list arraylist jfreechart

我想使用以下代码使用jfreechart绘制一条简单的x,y曲线:

package temp;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.util.List;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class recorder extends JFrame {
    int number=0;

    public recorder(int number, List time, List values) {    
        this.number=number;
        XYSeries series = new XYSeries(String.valueOf(number));

        // The 4 following lines are slow
        int n_value=time.size();
        for (int i=0;i<n_value;i++){
            series.add((double)time.get(i),(double)values.get(i));
        }
        // and that I would like to replace them by a "simple" assignement

        XYSeriesCollection dataset = new XYSeriesCollection(series);
        JFreeChart chart = ChartFactory.createXYLineChart("value","t","y",dataset,PlotOrientation.VERTICAL,true,true,false); 
        XYPlot plot = chart.getXYPlot();
        StandardXYItemRenderer renderer = new StandardXYItemRenderer();
        renderer.setSeriesPaint(0, Color.BLACK);
        plot.setRenderer(renderer);
        plot.setBackgroundPaint(Color.white);
        plot.setRangeGridlinesVisible(false);
        plot.setDomainGridlinesVisible(false);

        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(600, 400));
        chartPanel.setBackground(Color.white);
        setContentPane(chartPanel);
        pack();    
        setTitle("recorder"+String.valueOf(number));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

有没有人知道这样做的方法并摆脱循环和逐步的add()方法?在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

创建extends AbstractXYDataset的自定义类,如here所示,并为其提供接受java.util.List<E>的构造函数或公共方法。然后,不是冗余地遍历列表,而是getX()getY()的实现可以简单地返回所需的值。