如何使用java中的jFree图表创建动态折线图,该图表显示2小时前的数据,并且还提供一个空白区域,数据显示从当前时间开始2小时。例如假设当前时间是下午4点,所以图表显示数据从下午2点到下午6点。下午2点到下午4点,图表显示一条线,下午4点到下午6点提供一个空白区域,这是图形移动时填充的时间,这意味着该图形的尾部从中间开始向右移动。类似于股市图表。
答案 0 :(得分:9)
是的,你可以做到。几天前我遇到了类似的问题。
DynamicLineAndTimeSeriesChart.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
/**
* An example to show how we can create a dynamic chart.
*/
public class DynamicLineAndTimeSeriesChart extends ApplicationFrame implements ActionListener {
/** The time series data. */
private TimeSeries series;
/** The most recent value added. */
private double lastValue = 100.0;
/** Timer to refresh graph after every 1/4th of a second */
private Timer timer = new Timer(250, this);
/**
* Constructs a new dynamic chart application.
*
* @param title the frame title.
*/
public DynamicLineAndTimeSeriesChart(final String title) {
super(title);
this.series = new TimeSeries("Random Data", Millisecond.class);
final TimeSeriesCollection dataset = new TimeSeriesCollection(this.series);
final JFreeChart chart = createChart(dataset);
timer.setInitialDelay(1000);
//Sets background color of chart
chart.setBackgroundPaint(Color.LIGHT_GRAY);
//Created JPanel to show graph on screen
final JPanel content = new JPanel(new BorderLayout());
//Created Chartpanel for chart area
final ChartPanel chartPanel = new ChartPanel(chart);
//Added chartpanel to main panel
content.add(chartPanel);
//Sets the size of whole window (JPanel)
chartPanel.setPreferredSize(new java.awt.Dimension(800, 500));
//Puts the whole content on a Frame
setContentPane(content);
timer.start();
}
/**
* Creates a sample chart.
*
* @param dataset the dataset.
*
* @return A sample chart.
*/
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(
"Dynamic Line And TimeSeries Chart",
"Time",
"Value",
dataset,
true,
true,
false
);
final XYPlot plot = result.getXYPlot();
plot.setBackgroundPaint(new Color(0xffffe0));
plot.setDomainGridlinesVisible(true);
plot.setDomainGridlinePaint(Color.lightGray);
plot.setRangeGridlinesVisible(true);
plot.setRangeGridlinePaint(Color.lightGray);
ValueAxis xaxis = plot.getDomainAxis();
xaxis.setAutoRange(true);
//Domain axis would show data of 60 seconds for a time
xaxis.setFixedAutoRange(60000.0); // 60 seconds
xaxis.setVerticalTickLabels(true);
ValueAxis yaxis = plot.getRangeAxis();
yaxis.setRange(0.0, 300.0);
return result;
}
/**
* Generates an random entry for a particular call made by time for every 1/4th of a second.
*
* @param e the action event.
*/
public void actionPerformed(final ActionEvent e) {
final double factor = 0.9 + 0.2*Math.random();
this.lastValue = this.lastValue * factor;
final Millisecond now = new Millisecond();
this.series.add(new Millisecond(), this.lastValue);
System.out.println("Current Time in Milliseconds = " + now.toString()+", Current Value : "+this.lastValue);
}
/**
* Starting point for the dynamic graph application.
*
* @param args ignored.
*/
public static void main(final String[] args) {
final DynamicLineAndTimeSeriesChart demo = new DynamicLineAndTimeSeriesChart("Dynamic Line And TimeSeries Chart");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
请查看此处:
http://blog.odoobiz.com/2012/07/how-to-draw-dynamic-line-or-timeseries.html