import java.awt.Canvas;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.util.Random;import javax.swing.JFrame;class RainCanvas extends Canvas implements Runnable { private int width, height; private Image offScreen; // 缓冲图片 private char[][] charset; // 随机字符集合 private int[] pos; // 列的起始位置 private Color[] colors = new Color[30]; // 列的渐变颜色 public RainCanvas(int width, int height) { this.width = width; this.height = height; // 生成ASCII可见字符集合 Random rand = new Random(); charset = new char[width / 10][height / 10]; for (int i = 0; i < charset.length; i++) { for (int j = 0; j < charset[i].length; j++) { charset[i][j] = (char) (rand.nextInt(96) + 48); } } // 随机化列起始位置 pos = new int[charset.length]; for (int i = 0; i < pos.length; i++) { pos[i] = rand.nextInt(pos.length); } // 生成从黑色到绿色的渐变颜色,最后一个保持为白色 for (int i = 0; i < colors.length - 1; i++) { colors[i] = new Color(0, 255 / colors.length * (i + 1), 0); } colors[colors.length - 1] = new Color(255, 255, 255); setBackground(Color.BLACK); setSize(width, height); setVisible(true); } public void startRain() { new Thread(this).start(); } public void drawRain() { if (offScreen == null) { return; } Random rand = new Random(); Graphics g = offScreen.getGraphics(); g.clearRect(0, 0, width, height); g.setFont(new Font("Arial", Font.PLAIN, 14)); // for (int i = 0; i < charset.length; i++) { int speed = rand.nextInt(3); for (int j = 0; j < colors.length; j++) { int index = (pos[i] + j) % charset[i].length; g.setColor(colors[j]); g.drawChars(charset[i], index, 1, i * 10, index * 10); } pos[i] = (pos[i] + 1) % charset[i].length; } }
@override public void update(Graphics g) { paint(g); } public void run() { while (true) { drawRain(); repaint(); try { Thread.sleep(50); // 可改变睡眠时间以调节速度 } catch (InterruptedException e) { System.out.println(e); } } } @Override public void paint(Graphics g) { // 当组件显示时检测是否要创建缓冲图片,在组件还不可见时调用createImage将返回null if (offScreen == null) { offScreen = createImage(width, height); } g.drawImage(offScreen, 0, 0, this); }}public class Test extends JFrame { private RainCanvas canvas = new RainCanvas(1366, 768); // private RainCanvas canvas = new RainCanvas(800, 768); public Test() { super("Test"); setUndecorated(true); setExtendedState(JFrame.MAXIMIZED_BOTH); setVisible(true); canvas = new RainCanvas(this.getWidth(), this.getHeight()); // canvas = new RainCanvas(800,600); getContentPane().add(canvas); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { Test test = new Test(); test.canvas.startRain(); }}