因为需要使用JFreeChart动态显示出采集的数据,就看了这方面的资料!根据给出的例子,改了下啊,实时显示出内存大小!
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
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.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Minute;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.TextAnchor;
public class MyMemoryChart extends JPanel {
private static final long serialVersionUID = 1L;
private TimeSeriesCollection dataCollection = null;
private TimeSeries series = null;
private JFreeChart chart = null;
private XYPlot plot = null;
private ChartPanel chartPanel = null;
private int seconds_interval_of_X_axis = 30;
private int tickUnit_second_Count = 1;
private Marker vMarker = null;
private Marker hMarker = null;
public MyMemoryChart() {
series = new TimeSeries("");
series.setMaximumItemCount(100);
dataCollection = new TimeSeriesCollection(series);
createChart(dataCollection);
chartPanel = new ChartPanel(chart);
this.setLayout(new BorderLayout());
this.add(chartPanel, BorderLayout.CENTER);
}
private void createChart(TimeSeriesCollection dataCollection) {
chart = ChartFactory.createTimeSeriesChart("", "", "", dataCollection,
false, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成工具
false // 是否生成URL链接
);
chart.getTitle().setFont(new Font("Dialog", Font.PLAIN, 10));
chart.setTitle("No Data");
plot = chart.getXYPlot();
// 设置X轴特性
DateAxis domainAxis = new DateAxis();
GregorianCalendar gc = new GregorianCalendar();
GregorianCalendar gc1 = gc;
int year = gc.get(Calendar.YEAR);
int month = gc.get(Calendar.MONTH);
int day = gc.get(Calendar.DATE);
int hour = gc.get(Calendar.HOUR_OF_DAY);
int miniute = gc.get(Calendar.MINUTE);
int second = gc.get(Calendar.SECOND);
gc = new java.util.GregorianCalendar(year, month, day, hour, miniute,
second + 10);
second = second - seconds_interval_of_X_axis;
gc1 = new java.util.GregorianCalendar(year, month, day, hour, miniute,
second);
domainAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));
domainAxis.setRange(gc1.getTime(), gc.getTime());
domainAxis.setAutoRange(false);
domainAxis.setTickUnit(new DateTickUnit(DateTickUnit.SECOND,
tickUnit_second_Count, new SimpleDateFormat("mm:ss")));
plot.setDomainAxis(domainAxis);
// 1. 设置Y轴特性
NumberAxis vValueAxis = (NumberAxis) plot.getRangeAxis();
vValueAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));
vValueAxis.setAutoTickUnitSelection(false);
NumberTickUnit nt = new NumberTickUnit(0.2d); // 设置刻度
vValueAxis.setTickUnit(nt);
vValueAxis.setUpperBound(1); // 设置Y轴最大值
vValueAxis.setLowerBound(0); // 设置Y轴最小值
}
// 初始化图表的相关配置
public void setGraphNameAndInit(String name) {
chart.setTitle(name);
// 1. 设置Y轴特性
NumberAxis vValueAxis = (NumberAxis) plot.getRangeAxis();
vValueAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));
vValueAxis.setAutoTickUnitSelection(false);
double maxValue = Runtime.getRuntime().totalMemory();
double minValue = 32;
NumberTickUnit nt = new NumberTickUnit((maxValue - minValue) / 10.0); // 设置刻度
vValueAxis.setTickUnit(nt);
// 1. 设置Y轴特性
vValueAxis = (NumberAxis) plot.getRangeAxis();
vValueAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));
vValueAxis.setAutoTickUnitSelection(false);
vValueAxis.setUpperBound(maxValue); // 设置Y轴最大值
// vValueAxis.setLowerBound(minValue); // 设置Y轴最小值
// 2. 设置曲线颜色
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesShapesVisible(0, true);
renderer.setSeriesPaint(0, Color.BLUE);
renderer.setSeriesShape(0,
new Ellipse2D.Float(-3.0f, -3.0f, 6.0f, 6.0f)); // circle
plot.setRenderer(renderer);
// 3. 设置点击出现数据点值的提示信息
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);
plot.getRenderer().setSeriesToolTipGenerator(
0,
new StandardXYToolTipGenerator("({1}, {2})",
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
new DecimalFormat("#,##0.00")));
chartPanel.validate();
}
public void showingSeries(Timestamp ts, String pvType, String fieldName,
long fieldValue) {
GregorianCalendar gc = DateUtil.getGregorianCalendarFrameTimestap(ts);
int year = gc.get(Calendar.YEAR);
int month = gc.get(Calendar.MONTH);
int day = gc.get(Calendar.DATE);
int hour = gc.get(Calendar.HOUR_OF_DAY);
int miniute = gc.get(Calendar.MINUTE);
int second = gc.get(Calendar.SECOND);
final Hour h = new Hour(hour, new Day(day, month + 1, year));
series.addOrUpdate(new Second(second, new Minute(miniute, h)),
fieldValue);
DateAxis domainAxis = (DateAxis) plot.getDomainAxis();
// 设置X轴最大值
gc = new java.util.GregorianCalendar(year, month, day, hour, miniute,
second + 10);
domainAxis.setMaximumDate(new Date(gc.getTimeInMillis()));
// 设置X轴最小值, 最大值和最小值之间的距离为minutes_interval_of_X_axis分钟
gc.add(Calendar.SECOND, -seconds_interval_of_X_axis);
domainAxis.setMinimumDate(new Date(gc.getTimeInMillis()));
}
public static void main(String[] args) {
JFrame f = new JFrame();
MyMemoryChart chart = new MyMemoryChart();
chart.setGraphNameAndInit("Memory");
(chart.new DataGenerator(1000)).start();
f.add(chart);
f.setSize(400, 500);
f.setVisible(true);
// for (int i = 0; i < 100; i++) {
// GregorianCalendar gc = new GregorianCalendar();
// Timestamp ts = DateUtil.getTimestampFromGregorianCalendar(gc);
// chart.showingSeries(ts, "", "", getFreeMemory());
// }
}
class DataGenerator extends Timer implements ActionListener {
public void actionPerformed(ActionEvent actionevent) {
GregorianCalendar gc = new GregorianCalendar();
Timestamp ts = DateUtil.getTimestampFromGregorianCalendar(gc);
long l = Runtime.getRuntime().freeMemory();
long l1 = Runtime.getRuntime().totalMemory();
long value = getFreeMemory();
System.out.println("Value:"+value);
showingSeries(ts, "", "", value);
}
DataGenerator(int i) {
super(i, null);
addActionListener(this);
}
}
private static long getFreeMemory() {
return Runtime.getRuntime().freeMemory();
}
}