转载自http://bbs.csdn.net/topics/390428219?page=1
package com.tur.demo; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; class DataReceiver extends JPanel { private List<Integer> values; // 保存接收到的数据的容器. private static final int MAX_VALUE = 200; // 接收到的数据的最大值. private static final int MAX_COUNT_OF_VALUES = 50; // 最多保存数据的个数. public DataReceiver() { values = Collections.synchronizedList(new ArrayList<Integer>()); // 使用一个线程模拟产生数据. new Thread(new Runnable() { @Override public void run() { Random rand = new Random(); try { while (true) { addValue(rand.nextInt(MAX_VALUE)); // 产生一个数据,并模拟接收并放到容器里. repaint(); Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w = getWidth(); int h = getHeight(); int xDelta = w / MAX_COUNT_OF_VALUES; int length = values.size(); for (int i = 0; i < length - 1; ++i) { g2d.drawLine(xDelta * (MAX_COUNT_OF_VALUES - length + i),h-normalizeValueForYAxis(values.get(i), h), xDelta * (MAX_COUNT_OF_VALUES - length + i + 1),h-normalizeValueForYAxis(values.get(i + 1), h)); } } /** * 接收到的数据放入内存. * @param value */ private void addValue(int value) { // 循环的使用一个接收数据的空间. // 最好是实现一个循环数组,而不是偷懒的使用ArrayList. if (values.size() > MAX_COUNT_OF_VALUES) { values.remove(0); } values.add(value); } /** * 规一化y轴方向的值. 使得value在y轴的值为[0, height]之间. * * @param value * @param height * @return */ private int normalizeValueForYAxis(int value, int height) { return (int) ((double) height / MAX_VALUE * value); } private static void createGuiAndShow() { JFrame frame = new JFrame(""); frame.getContentPane().add(new DataReceiver()); // Set frame's close operation and location in the screen. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { createGuiAndShow(); } }