Problems with creating multiple series in XYPlot with JFreeChart(使用 JFreeChart 在 XYPlot 中创建多个系列的问题)
问题描述
The following example code creates a graph with only one data series. The other two data series will not be created.
The main()-methods contains the data series.
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import javax.swing.*;
public class MultipleChartFactory {
private XYPlot plot;
private ChartPanel chartPanel;
// datasetIndex is used for multiple datasets
private int datasetIndex = 0;
private ArrayList<XYSeriesCollection> seriesArrayList = new ArrayList<XYSeriesCollection>();
public MultipleChartFactory(String title, String xAxis) {
super();
String yAxis = title;
XYSeriesCollection dataset = createDataset("Series");
JFreeChart chart = ChartFactory.createXYLineChart("", xAxis, yAxis, dataset, PlotOrientation.VERTICAL, false, false, false);
chart.setBackgroundPaint(Color.white);
plot = chart.getXYPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
NumberAxis rangeAxis2 = new NumberAxis("Range Axis 2");
rangeAxis2.setAutoRangeIncludesZero(false);
JPanel content = new JPanel(new BorderLayout());
chartPanel = new ChartPanel(chart);
content.add(chartPanel);
}
private XYSeriesCollection createDataset(String name) {
XYSeries series = new XYSeries(name);
return new XYSeriesCollection(series);
}
public ChartPanel getChart() {
return chartPanel;
}
public void createAdditionalDataset() {
seriesArrayList.add(createDataset("S" + this.datasetIndex));
this.datasetIndex++;
this.plot.setDataset(
this.datasetIndex, seriesArrayList.get(0));
this.plot.setRenderer(this.datasetIndex, new StandardXYItemRenderer());
}
public XYSeriesCollection getXYSeries(int datasetIndex) {
return seriesArrayList.get(datasetIndex);
}
public int getDatasetCount() {
return this.plot.getDatasetCount();
}
public static void main(String [] args) throws InterruptedException {
MultipleChartFactory mcf = new MultipleChartFactory("Battery","Time");
JFrame frame = new JFrame();
frame.setSize(700, 700);
JPanel panel = new JPanel();
panel.add(mcf.getChart());
frame.add(panel);
frame.setVisible(true);
// on closing window
frame.addWindowListener(new WindowAdapter() {
public synchronized void windowClosing(WindowEvent we) {
System.exit(0);
}
});
mcf.createAdditionalDataset();
mcf.createAdditionalDataset();
mcf.createAdditionalDataset();
mcf.getXYSeries(0).getSeries(0).add(1, 10);
mcf.getXYSeries(0).getSeries(0).add(2, 100);
Thread.sleep(3000);
System.out.println("first");
mcf.getXYSeries(1).getSeries(0).add(1, 20);
mcf.getXYSeries(1).getSeries(0).add(2, 200);
Thread.sleep(3000);
System.out.println("second");
mcf.getXYSeries(2).getSeries(0).add(1, 30);
mcf.getXYSeries(2).getSeries(0).add(2, 300);
}
}
Debugger stops after mcf.getXYSeries(0).getSeries(0).add(1, 10);. I am not really understanding why it stops there.
Do you have suggestion to display every data series in the graph?
You need to use the datasetIndex when acessing the seriesArrayList.
public void createAdditionalDataset() {
seriesArrayList.add(createDataset("S" + this.datasetIndex));
this.plot.setDataset(this.datasetIndex, seriesArrayList.get(datasetIndex));
this.plot.setRenderer(this.datasetIndex, new StandardXYItemRenderer());
this.datasetIndex++;
}
Notes:
Program to the interface, e.g.
List<XYSeriesCollection>.Use
pack()on the enclosingWindowto obtain the preferred size of components.See also Initial Threads.
SSCCE:
import java.awt.BorderLayout;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
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;
import javax.swing.*;
public class MultipleChartFactory {
private XYPlot plot;
private ChartPanel chartPanel;
private int datasetIndex = 0;
private List<XYSeriesCollection> seriesArrayList = new ArrayList<XYSeriesCollection>();
public MultipleChartFactory(String title, String xAxis) {
super();
String yAxis = title;
XYSeriesCollection dataset = createDataset("Series");
JFreeChart chart = ChartFactory.createXYLineChart("", xAxis, yAxis,
dataset, PlotOrientation.VERTICAL, false, false, false);
chart.setBackgroundPaint(Color.white);
plot = chart.getXYPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
NumberAxis rangeAxis2 = new NumberAxis("Range Axis 2");
rangeAxis2.setAutoRangeIncludesZero(false);
JPanel content = new JPanel(new BorderLayout());
chartPanel = new ChartPanel(chart);
content.add(chartPanel);
}
private XYSeriesCollection createDataset(String name) {
XYSeries series = new XYSeries(name);
return new XYSeriesCollection(series);
}
public ChartPanel getChart() {
return chartPanel;
}
public void createAdditionalDataset() {
seriesArrayList.add(createDataset("S" + this.datasetIndex));
this.plot.setDataset(this.datasetIndex, seriesArrayList.get(datasetIndex));
this.plot.setRenderer(this.datasetIndex, new StandardXYItemRenderer());
this.datasetIndex++;
}
public XYSeriesCollection getXYSeries(int datasetIndex) {
return seriesArrayList.get(datasetIndex);
}
public int getDatasetCount() {
return this.plot.getDatasetCount();
}
public static void main(String[] args) throws InterruptedException {
MultipleChartFactory mcf = new MultipleChartFactory("Battery", "Time");
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.add(mcf.getChart());
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
mcf.createAdditionalDataset();
mcf.createAdditionalDataset();
mcf.createAdditionalDataset();
mcf.getXYSeries(0).getSeries(0).add(1, 10);
mcf.getXYSeries(0).getSeries(0).add(2, 100);
System.out.println("first");
mcf.getXYSeries(1).getSeries(0).add(1, 20);
mcf.getXYSeries(1).getSeries(0).add(2, 200);
System.out.println("second");
mcf.getXYSeries(2).getSeries(0).add(1, 30);
mcf.getXYSeries(2).getSeries(0).add(2, 300);
}
}
这篇关于使用 JFreeChart 在 XYPlot 中创建多个系列的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 JFreeChart 在 XYPlot 中创建多个系列的问题
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
