etha.ri...@gmail.com
unread,Jun 8, 2009, 11:16:50 PM6/8/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to vogella
Hello everyone,
I want to make a dynamic chart in eclipse rcp and I've got error like
this
Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException:
Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3777)
at org.eclipse.swt.SWT.error(SWT.java:3695)
at org.eclipse.swt.SWT.error(SWT.java:3666)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.Control.redraw(Control.java:1986)
at org.jfree.experimental.chart.swt.ChartComposite.chartChanged
(ChartComposite.java:961)
at org.jfree.chart.JFreeChart.notifyListeners(JFreeChart.java:1517)
at org.jfree.chart.JFreeChart.plotChanged(JFreeChart.java:1583)
at org.jfree.chart.plot.Plot.notifyListeners(Plot.java:968)
at org.jfree.chart.plot.XYPlot.datasetChanged(XYPlot.java:4521)
at org.jfree.data.general.AbstractDataset.notifyListeners
(AbstractDataset.java:185)
at org.jfree.data.general.AbstractDataset.fireDatasetChanged
(AbstractDataset.java:168)
at org.jfree.data.general.AbstractSeriesDataset.seriesChanged
(AbstractSeriesDataset.java:110)
at org.jfree.data.general.Series.notifyListeners(Series.java:328)
at org.jfree.data.general.Series.fireSeriesChanged(Series.java:313)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:533)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:562)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:548)
at org.example.memoryusagechart.View.addTotalObservation(View.java:
112)
at org.example.memoryusagechart.View.access$0(View.java:111)
at org.example.memoryusagechart.View$DataGenerator.actionPerformed
(View.java:132)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown
Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown
Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
I use source from JFreeChart (dynamic chart), this the code :
package org.example.memoryusagechart;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
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.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.experimental.chart.swt.ChartComposite;
import org.jfree.ui.RectangleInsets;
import javax.swing.Timer;
public class View extends ViewPart {
public static final String ID = "MemoryUsageChart.view";
private TimeSeries total;
private TimeSeries free;
//private static XYPlot plot;
public View() {
}
/**
* This is a callback that will allow us to create the viewer and
initialize
* it.
*/
public void createPartControl(Composite parent) {
new DataGenerator(100).start();
this.total = new TimeSeries("Total", Millisecond.class);
this.total.setMaximumItemAge(30000);
this.free = new TimeSeries("Free", Millisecond.class);
this.free.setMaximumItemAge(30000);
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(this.total);
dataset.addSeries(this.free);
DateAxis domain = new DateAxis("Time");
NumberAxis range = new NumberAxis("Memory");
domain.setTickLabelFont(new Font("SansSerif", Font.PLAIN,
12));
range.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));
domain.setLabelFont(new Font("SansSerif", Font.PLAIN, 14));
range.setLabelFont(new Font("SansSerif", Font.PLAIN, 14));
XYItemRenderer renderer = new XYLineAndShapeRenderer(true,
false);
renderer.setSeriesPaint(0, Color.red);
renderer.setSeriesPaint(1, Color.green);
renderer.setStroke(new BasicStroke(3f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL));
XYPlot plot = new XYPlot(dataset, domain, range, renderer);
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
domain.setAutoRange(true);
domain.setLowerMargin(0.0);
domain.setUpperMargin(0.0);
domain.setTickLabelsVisible(true);
range.setStandardTickUnits(NumberAxis.createIntegerTickUnits
());
JFreeChart chart = new JFreeChart("JVM Memory Usage",
new Font("SansSerif", Font.BOLD, 24), plot, true);
final ChartComposite frame = new ChartComposite(parent, SWT.NONE,
chart, true);
frame.setBounds(200, 120, 600, 280);
frame.setVisible(true);
}
/*private static JFreeChart createChart() {
chart.setBackgroundPaint(new Color(249, 231, 236));
return chart;
}*/
/**
* Adds an observation to the ’total memory’ time series.
*
* @param y the total memory used.
*/
private void addTotalObservation(double y) {
this.total.add(new Millisecond(), y);
}
private void addFreeObservation(double y) {
this.free.add(new Millisecond(), y);
}
class DataGenerator extends Timer implements ActionListener {
DataGenerator(int interval) {
// TODO Auto-generated constructor stub
super(interval, null);
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
long f = Runtime.getRuntime().freeMemory();
long t = Runtime.getRuntime().totalMemory();
addTotalObservation(t);
addFreeObservation(f);
}
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
}
}
please help me to solve the problem. Thanks before.
Regards,
Ringo