I saw some questions for dynamic swt jfreechart recently.
Here is demo code. Try this.
But, it have some problems. Just now, I don't know why.
If I don't use ChartComposite.forceRedraw(), chart can't redraw itself.
And error occur after a short period of time.
Need to try more things...
Code: Select all
package demo.swt;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
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.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;
public class SWTMemoryUsageDemo {
private static Display display;
private static ChartComposite chartComposite;
private TimeSeries total;
private TimeSeries free;
class DataGenerator extends Timer implements ActionListener {
DataGenerator(int i) {
super(i, null);
addActionListener(this);
}
public void actionPerformed(ActionEvent actionevent) {
// [SILENT] for SWT UI thread issue, use Display.asyncExec()
display.asyncExec(new Runnable() {
public void run() {
long l = Runtime.getRuntime().freeMemory();
long l1 = Runtime.getRuntime().totalMemory();
addTotalObservation(l1);
addFreeObservation(l);
// [SILENT] for chart redraw, use ChartComposite.forceRedraw();
// if not use this, then chart will not redraw.
// I don't know why.
chartComposite.forceRedraw();
}
});
}
}
public SWTMemoryUsageDemo(int i) {
total = new TimeSeries("Total Memory", org.jfree.data.time.Millisecond.class);
total.setMaximumItemAge(i);
free = new TimeSeries("Free Memory", org.jfree.data.time.Millisecond.class);
free.setMaximumItemAge(i);
}
public JFreeChart createChart() {
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(total);
timeseriescollection.addSeries(free);
DateAxis dateaxis = new DateAxis("Time");
NumberAxis numberaxis = new NumberAxis("Memory");
dateaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
numberaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
dateaxis.setLabelFont(new Font("SansSerif", 0, 14));
numberaxis.setLabelFont(new Font("SansSerif", 0, 14));
XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(true, false);
xylineandshaperenderer.setSeriesPaint(0, Color.red);
xylineandshaperenderer.setSeriesPaint(1, Color.green);
xylineandshaperenderer.setStroke(new BasicStroke(3F, 0, 2));
XYPlot xyplot = new XYPlot(timeseriescollection, dateaxis, numberaxis, xylineandshaperenderer);
xyplot.setBackgroundPaint(Color.lightGray);
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
dateaxis.setAutoRange(true);
dateaxis.setLowerMargin(0.0D);
dateaxis.setUpperMargin(0.0D);
dateaxis.setTickLabelsVisible(true);
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
JFreeChart jfreechart = new JFreeChart("JVM Memory Usage", new Font("SansSerif", 1, 24), xyplot, true);
jfreechart.setBackgroundPaint(Color.white);
return jfreechart;
}
private void addTotalObservation(final double d) {
total.addOrUpdate(new Millisecond(), d);
}
private void addFreeObservation(final double d) {
free.addOrUpdate(new Millisecond(), d);
}
public static void main(String args[]) {
display = new Display();
Shell shell = new Shell(display);
shell.setSize(600, 300);
shell.setLayout(new FillLayout());
shell.setText("Memory Usage Demo");
SWTMemoryUsageDemo memoryusagedemo = new SWTMemoryUsageDemo(30000);
JFreeChart chart = memoryusagedemo.createChart();
chartComposite = new ChartComposite(shell, SWT.NONE, chart, true);
chartComposite.setDisplayToolTips(true);
chartComposite.setHorizontalAxisTrace(false);
chartComposite.setVerticalAxisTrace(false);
shell.open();
(memoryusagedemo.new DataGenerator(100)).start();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
Code: Select all
org.eclipse.swt.SWTError: No more handles
at org.eclipse.swt.SWT.error(SWT.java:3400)
at org.eclipse.swt.SWT.error(SWT.java:3297)
at org.eclipse.swt.SWT.error(SWT.java:3268)
at org.eclipse.swt.widgets.Display.internal_new_GC(Display.java:2165)
at org.eclipse.swt.graphics.Device.computePixels(Device.java:201)
at org.eclipse.swt.graphics.Font.init(Font.java:210)
at org.eclipse.swt.graphics.Font.<init>(Font.java:72)
at org.jfree.experimental.swt.SWTUtils.toSwtFontData(SWTUtils.java:131)
at org.jfree.experimental.swt.SWTGraphics2D.setFont(SWTGraphics2D.java:647)
at org.jfree.chart.axis.ValueAxis.drawTickMarksAndLabels(ValueAxis.java:687)
at org.jfree.chart.axis.NumberAxis.draw(NumberAxis.java:667)
at org.jfree.chart.plot.XYPlot.drawAxes(XYPlot.java:3019)
at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:2531)
at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1175)
at org.jfree.experimental.chart.swt.ChartComposite$1.paintControl(ChartComposite.java:558)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:83)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:937)
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:709)
at org.jfree.experimental.chart.swt.ChartComposite.forceRedraw(ChartComposite.java:1104)
at demo.swt.SWTMemoryUsageDemo$1.run(SWTMemoryUsageDemo.java:56)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3325)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2971)
at demo.swt.SWTMemoryUsageDemo.main(SWTMemoryUsageDemo.java:131)