利用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 }

效果圖:

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM