Java JFreeChart timeseries未刷新
我使用来自的代码开发了一个timeseries JFreeChart。 我想把它添加到我的主面板中,主面板包含四个其他面板。所以我创建了一个方法Java JFreeChart timeseries未刷新,java,swing,jfreechart,Java,Swing,Jfreechart,我使用来自的代码开发了一个timeseries JFreeChart。 我想把它添加到我的主面板中,主面板包含四个其他面板。所以我创建了一个方法 package com.garnet.panel; import java.awt.*; import java.awt.event.*; import java.text.*; import java.text.SimpleDateFormat; import java.util.Calendar;
package com.garnet.panel;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.DynamicTimeSeriesCollection;
import org.jfree.data.time.Second;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.RefineryUtilities;
public class PrepareChart {
private static final String TITLE = "Dynamic Series";
private static final int COUNT = 2 * 60;
private Timer timer;
private static float lastValue = 49.62f;
ValueAxis axis;
DateAxis dateAxis;
public JFreeChart chart;
public PrepareChart() {
super();
final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
// Get the calender date time which will inserted into time series chart
// Based on time we are getting here we disply the chart
Calendar calendar = new GregorianCalendar();
int date = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
int seconds = calendar.get(Calendar.SECOND);
System.out.println("In caht constructor methoed");
dataset.setTimeBase(new Second(seconds, minutes-2, hours, date, month, year));
dataset.addSeries(gaussianData(), 0, "Currency Rate");
chart= createChart(dataset);
timer = new Timer(969, new ActionListener() {
float[] newData = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
System.out.println("In caht timer methoed");
dataset.advanceTime();
dataset.appendData(newData);
}
});
}
private float randomValue() {
double factor = 2 * Math.random();
if (lastValue >51){
lastValue=lastValue-(float)factor;
}else {
lastValue = lastValue + (float) factor;
}
return lastValue;
}
// For getting the a random float value which is supplied to dataset of time series chart
private float[] gaussianData() {
float[] a = new float[COUNT];
for (int i = 0; i < a.length; i++) {
a[i] = randomValue();
}
return a;
}
// This methode will create the chart in the required format
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE, "hh:mm:ss", "Currency", dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
plot.setBackgroundPaint(Color.BLACK);
plot.setDomainGridlinePaint(Color.WHITE);
plot.setRangeGridlinePaint(Color.WHITE);
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);
XYItemRenderer r = plot.getRenderer();
if (r instanceof XYLineAndShapeRenderer) {
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
renderer.setBaseShapesVisible(true);
renderer.setBaseShapesFilled(true);
renderer.setBasePaint(Color.white);
renderer.setSeriesPaint(0,Color.magenta);
}
dateAxis= (DateAxis)plot.getDomainAxis();
DateTickUnit unit = null;
unit = new DateTickUnit(DateTickUnitType.SECOND,30);
DateFormat chartFormatter = new SimpleDateFormat("HH:mm:ss");
dateAxis.setDateFormatOverride(chartFormatter);
dateAxis.setTickUnit(unit);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setRange(lastValue-4, lastValue+4);
return result;
}
public void start(){
timer.start();
}
public JPanel getChartPanel(){
EventQueue.invokeLater(new Runnable() {
public void run() {
PrepareChart chart = new PrepareChart();
System.out.println("In caht getter methoed");
chart.start();
}
});
return new ChartPanel(chart);
}
}
但是,当我将此面板添加到框架中时,图形不会动态变化。好的,我想我已经发现了您的问题,但是如果不了解您如何使用所有这些代码,我无法完全确定 你的主要问题在于:
public JPanel getChartPanel(){
EventQueue.invokeLater(new Runnable() {
public void run() {
PrepareChart chart = new PrepareChart();
System.out.println("In caht getter methoed");
chart.start();
}
});
return new ChartPanel(chart);
}
在Runnable中,重新创建PrepareChart的新实例并启动它。这没有任何意义:
PrepareChart
实例从未启动(因此您不会看到它动态更新)public JPanel getChartPanel() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
start();
}
});
return new ChartPanel(chart);
}
这是我写的一个小的主要方法,它似乎起到了作用
public static void main(String[] args) {
PrepareChart prepareChart = new PrepareChart();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(prepareChart.getChartPanel());
frame.pack();
frame.setVisible(true);
}
考虑重命名您的类ChartPanel
,因为它与JFreeChart的名称冲突,这令人困惑。另外,我看不到它的用途,因为您可以直接在PrepareChart返回的ChartPanel上执行所有这些操作
顺便说一句,在getter方法中调用
start()
是很奇怪的。好的,我想我已经发现了您的问题,但是如果不了解您如何使用所有这些代码,我就不能完全确定
你的主要问题在于:
public JPanel getChartPanel(){
EventQueue.invokeLater(new Runnable() {
public void run() {
PrepareChart chart = new PrepareChart();
System.out.println("In caht getter methoed");
chart.start();
}
});
return new ChartPanel(chart);
}
在Runnable中,重新创建PrepareChart的新实例并启动它。这没有任何意义:
PrepareChart
实例从未启动(因此您不会看到它动态更新)public JPanel getChartPanel() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
start();
}
});
return new ChartPanel(chart);
}
这是我写的一个小的主要方法,它似乎起到了作用
public static void main(String[] args) {
PrepareChart prepareChart = new PrepareChart();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(prepareChart.getChartPanel());
frame.pack();
frame.setVisible(true);
}
考虑重命名您的类ChartPanel
,因为它与JFreeChart的名称冲突,这令人困惑。另外,我看不到它的用途,因为您可以直接在PrepareChart返回的ChartPanel上执行所有这些操作
顺便说一句,在getter方法中调用
start()。编辑您的问题并提供一个。我已经添加了所有代码,您需要jfreechart库来编译它。您的代码甚至不编译。编辑您的问题并提供一个。我已经添加了所有代码,您需要jfreechart库来编译它。谢谢,它对我来说工作得很好,在第一次打开窗口时,当我最小化和最大化显示的框架时,它不会显示图表graph@mallikarjun考虑调用<代码>包()
在JFrame上显示,然后再将其显示出来。显示后,无论何时向容器中添加/删除组件,都在容器上调用revalidate()
。是的,我在容器(chatpanel类)上调用了revalidate,但它不工作。我的图表显示有时间延迟。我将面板插入主面板上的另一个面板。所以我在超级面板上调用了重新验证。但是显示图表的时间延迟仍然存在(大约在屏幕打开后的5秒)。我猜不出你的程序出了什么问题。我所能说的是,你不需要最小化/最大化你的帧来查看所有内容。谢谢,它对我来说很好,第一次打开窗口时,当我最小化和最大化它显示的帧时,它没有显示图表graph@mallikarjun在你的JFrice中调用<代码>包()/代码>,然后使它可见。显示后,无论何时向容器中添加/删除组件,都在容器上调用revalidate()
。是的,我在容器(chatpanel类)上调用了revalidate,但它不工作。我的图表显示有时间延迟。我将面板插入主面板上的另一个面板。所以我在超级面板上调用了重新验证。但是显示图表的时间延迟仍然存在(大约在屏幕打开后的5秒)。我猜不出你的程序出了什么问题。我所能说的是,你不需要最小化/最大化你的框架来看到一切。