利用JavaSwing---画图小例子

   javaswing是制作桌面程序的必备知识,但是个人的感觉吧,还是有点次,不过实现的效果还可以!我之前用这个更改做过监控电脑cpu使用率的应用,这个例子还是很不错的!

  1 import java.awt.BorderLayout;
  2 import java.awt.EventQueue;
  3 
  4 import javax.swing.JFrame;
  5 import javax.swing.JPanel;
  6 import javax.swing.border.EmptyBorder;
  7 
  8 
  9 
 10 import javax.swing.*;
 11 import java.awt.*;
 12 import java.util.ArrayList;
 13 import java.util.Collections;
 14 import java.util.List;
 15 import java.util.Random;
 16 
 17 class DataReceiver extends JPanel {
 18     private List<Integer> values;                      // 保存接收到的数据的容器.
 19     private static final int MAX_VALUE = 200;          // 接收到的数据的最大值.
 20     private static final int MAX_COUNT_OF_VALUES = 50; // 最多保存数据的个数.
 21 
 22     public DataReceiver() {
 23         values = Collections.synchronizedList(new ArrayList<Integer>());
 24 
 25         // 使用一个线程模拟产生数据.
 26         new Thread(new Runnable() {
 27             @Override
 28             public void run() {
 29                 Random rand = new Random();
 30 
 31                 try {
 32                     while (true) {
 33                         addValue(rand.nextInt(MAX_VALUE)); // 产生一个数据,并模拟接收并放到容器里.
 34                         repaint();
 35                         Thread.sleep(100);
 36                     }
 37                 } catch (InterruptedException e) {
 38                     e.printStackTrace();
 39                 }
 40             }
 41         }).start();
 42     }
 43 
 44     @Override
 45     public void paintComponent(Graphics g) {
 46         super.paintComponent(g);
 47 
 48         Graphics2D g2d = (Graphics2D) g;
 49         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 50 
 51         int w = getWidth();
 52         int h = getHeight();
 53         int xDelta = w / MAX_COUNT_OF_VALUES;
 54         int length = values.size();
 55 
 56         for (int i = 0; i < length - 1; ++i) {
 57             g2d.drawLine(xDelta * (MAX_COUNT_OF_VALUES - length + i), normalizeValueForYAxis(values.get(i), h),
 58                     xDelta * (MAX_COUNT_OF_VALUES - length + i + 1), normalizeValueForYAxis(values.get(i + 1), h));
 59         }
 60     }
 61 
 62     /**
 63      * 接收到的数据放入内存.
 64      * @param value
 65      */
 66     private void addValue(int value) {
 67         // 循环的使用一个接收数据的空间.
 68         // 最好是实现一个循环数组,而不是偷懒的使用ArrayList.
 69         if (values.size() > MAX_COUNT_OF_VALUES) {
 70             values.remove(0);
 71         }
 72 
 73         values.add(value);
 74     }
 75 
 76     /**
 77      * 规一化y轴方向的值. 使得value在y轴的值为[0, height]之间.
 78      *
 79      * @param value
 80      * @param height
 81      * @return
 82      */
 83     private int normalizeValueForYAxis(int value, int height) {
 84         return (int) ((double) height / MAX_VALUE * value);
 85     }
 86 
 87     private static void createGuiAndShow() {
 88         JFrame frame = new JFrame("");
 89 
 90         frame.getContentPane().add(new DataReceiver());
 91 
 92         // Set frame's close operation and location in the screen.
 93         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 94         frame.setSize(400, 400);
 95         frame.setLocationRelativeTo(null);
 96         frame.setVisible(true);
 97     }
 98 
 99     public static void main(String[] args) {
100         createGuiAndShow();
101     }
102 }

效果图:

   

有些鸟儿的羽毛太过耀眼,注定不是关在笼中的那种!
原文地址:https://www.cnblogs.com/wuxinwuxin/p/7763572.html