1. 程式人生 > >利用JavaSwing---畫圖小例子

利用JavaSwing---畫圖小例子

gui jframe args tco extends ide nbsp 監控 runnable

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 }

效果圖:

技術分享

利用JavaSwing---畫圖小例子