【问题标题】:JFreeChart Java - How to create it is a lot of series in a cycleJFreeChart Java - 如何创建它是一个循环中的很多系列
【发布时间】:2014-02-22 00:09:44
【问题描述】:

我有一个从 InitP 文件中获取坐标的样条图形。我计划扩展一个代码来加载多个文件的图形(对于每个图形,都有一个带有一组坐标的文件)。

在输入中包含文件名的行。在每个系列的循环中,将滑动相应图表的数据集坐标。创建新系列时出现困难,我不知道在读取新文件时要创建一个新系列(我不知道如何循环创建系列2,系列3,因为我不知道会有多少系列)。一个图形有一个代码。

        series1 = new XYSeries("Graph");
        try {
                Scanner s = new Scanner(new File("InitP"));
                System.out.println("Open success!");
                float xpol =  0, ypol = 0;
                s.useLocale(Locale.US);
                while (s.hasNext()) {
                    if (s.hasNextFloat()) {
                        xpol = s.nextFloat();
                        ypol = s.nextFloat();
                        System.out.println("x = " + xpol + ", y = " + ypol);
                        series1.add(xpol, ypol);

                    } else {
                        s.next();
                    }
                }
                dataset.addSeries(series1);
            } catch (FileNotFoundException ex) {
                System.out.println("Can't find file!");
            }
        XYSeriesCollection dataset = new XYSeriesCollection();

【问题讨论】:

    标签: java swing jfreechart


    【解决方案1】:

    创建您的XYSeriesCollection dataset循环文件之前。对于每个文件,创建一个新的XYSeries 并使用dataset.addSeries() 将新系列添加到现有的dataset。收听图表会自行更新,如here 所示。因为文件访问本质上是异步的,所以在SwingWorkerdoInBackground() 方法的实现中循环访问文件,如here 所示。

    附录:我需要创建seriesN,其中N是一个数字。

    作为一个具体的例子,下面的createDataset() 方法为"user.dir" 中的每个文件添加了一个系列。它使用文件的hashcode() 进行编号,但您可以增加计数器等。

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.io.File;
    import java.util.Random;
    import javax.swing.JFrame;
    import org.jfree.chart.*;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.data.xy.XYDataset;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
    
    /** @see https://stackoverflow.com/a/21953170/230513 */
    public class ChartPanelXYTest {
    
        private static final Random random = new Random();
    
        private static XYDataset createDataset() {
            XYSeriesCollection dataset = new XYSeriesCollection();
            File[] files = new File(System.getProperty("user.dir")).listFiles();
            for (File f : files) {
                XYSeries series = new XYSeries("f" + f.hashCode());
                for (int i = 0; i < f.getName().length(); i++) {
                    series.add(i, random.nextGaussian());
                }
                dataset.addSeries(series);
            }
            return dataset;
        }
    
        private static JFreeChart createChart(final XYDataset dataset) {
            JFreeChart chart = ChartFactory.createXYLineChart("Test", "Domain",
                "Range", dataset, PlotOrientation.VERTICAL, true, false, false);
            return chart;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    XYDataset dataset = createDataset();
                    JFreeChart chart = createChart(dataset);
                    ChartPanel chartPanel = new ChartPanel(chart) {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(640, 480);
                        }
                    };
                    f.add(chartPanel);
                    f.pack();
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

    • 谢谢,但是如何在循环中创建新的 XYSeries?我不明白这一步。我需要创建 seriesN,其中 N 是一个数字。如何让它循环?感谢doInBackground(),我忘记了
    • 我不知道你卡在哪里了。
    • 太棒了!非常感谢,我理解我的错误
    【解决方案2】:

    您可以使用以下策略:

    • 外循环:读取文件(或处理输入参数)以获取每个单独的坐标文件的名称
    • 为每个文件名创建一个系列并将其添加到向量中
    • 从文件名处理系列(完成后不要忘记关闭每个文件)
    • 循环

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2013-08-07
      • 2021-10-09
      • 2022-07-12
      相关资源
      最近更新 更多