Dynamic Chart

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Edward Pottasch

Dynamic Chart

Post by Edward Pottasch » Wed Jul 17, 2002 3:11 pm

hi all,

I'm currently testing a DDE (Dynamic Data Exchange) connection I made with a real-time provider of stock data.

I'm using the Dynamic data demo code to plot the data. It works beautifully to some point .... For some reason it adds the same x-value (time period)occasionally.

the code fragments are given below:

here the transaction listener where I add a datapoint to the series (which is defined as (BasicTimeSeries series = new BasicTimeSeries("Stock data", Millisecond.class);) elsewhere in the program.

cl.addDdeClientTransactionEventListener(new com.neva.DdeClientTransactionEventAdaptor() {
public void onAdviseData(com.neva.DdeClientTransactionEvent e) {
String data=new String(e.getDdeData());
data = data.substring(0,data.indexOf('.')+3);
double lastValue = Double.parseDouble(data);
series.add(new Millisecond();, lastValue);

}

public void onDisconnect(com.neva.DdeClientTransactionEvent e) {
System.out.println("Server has gone !");
System.exit(0);
};
});


elsewhere in the program I connect to a single cell of the real-time stock provider and define some chart stuff:

cl.connect("EB_RT","19_QQQ");
cl.startAdvise("t\0",format,1);

TimeSeriesCollection dataset = new TimeSeriesCollection(series);
JFreeChart chart = ChartFactory.createTimeSeriesChart("RT Data", "Time", "Dollar",
dataset, false);
XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis = plot.getRangeAxis();
ChartPanel chartPanel = new ChartPanel(chart);
contentPane.add(chartPanel);



the error I get:

com.jrefinery.data.SeriesException: TimeSeries.add(...): time period already exists.
at com.jrefinery.data.BasicTimeSeries.add(Unknown Source)
at com.jrefinery.data.BasicTimeSeries.add(Unknown Source)
at dde_project.DDEFrame$3.onAdviseData(DDEFrame.java:101)
at com.neva.DdeCallback2.DdeCallback(DdeClient.java:376)
at com.neva.Coroutine.invokePrim(Native Method)
at com.neva.Coroutine.invoke(Coroutine.java:289)
at com.neva.DdeUtil.DispatchMessage(DdeUtil.java:364)
at com.neva.DdeClientMessagePump.run(DdeClient.java:504)
at java.lang.Thread.run(Thread.java:484)

isn't that strange .... because everytime it adds a new time period the time period is defined by new Millisecond() ......

thanks for any help

Edward Pottasch

Re: Dynamic Chart

Post by Edward Pottasch » Thu Jul 25, 2002 3:04 pm

I solved the problem simply by checking if a certain time already exists. However I do not understand why new Millisecond() makes two times that are the same ....

if (newTime.equals(oldTime)) {
// skip this time
} else {
series.add(newTime, lastValue);
oldTime = newTime;
}


now it takes a while before the program crashes (well actually it just spits out red error messages but continues running). Believe me it looks really cool this dynamic chart. Now I get the following error message. Any idea what is wrong here?

Thanks in advance,

Edward


error message:

sun.dc.pr.PRException: endPath: bad path
at sun.dc.pr.Rasterizer.endPath(Rasterizer.java:540)
at sun.java2d.pipe.DuctusRenderer.createShapeRasterizer(DuctusRenderer.java:296)
at sun.java2d.pipe.DuctusShapeRenderer.renderPath(DuctusShapeRenderer.java:59)
at sun.java2d.pipe.DuctusShapeRenderer.draw(DuctusShapeRenderer.java:48)
at sun.java2d.SunGraphics2D.draw(SunGraphics2D.java:1599)
at com.jrefinery.chart.StandardXYItemRenderer.drawItem(Unknown Source)
at com.jrefinery.chart.XYPlot.render(Unknown Source)
at com.jrefinery.chart.XYPlot.draw(Unknown Source)
at com.jrefinery.chart.JFreeChart.draw(Unknown Source)
at com.jrefinery.chart.ChartPanel.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(JComponent.java:687)
at javax.swing.JComponent.paintWithBuffer(JComponent.java:3878)
at javax.swing.JComponent._paintImmediately(JComponent.java:3821)
at javax.swing.JComponent.paintImmediately(JComponent.java:3672)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:370)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:124)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:154)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:337)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:131)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:98)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)

Locked