A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package zfy;

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 ZFYTest extends JFrame{

         private RainCanvas canvas = new RainCanvas(1366, 768);
         
         public ZFYTest() {
                 super("ZFY");
                 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) {
                 
                 ZFYTest test = new ZFYTest();
                 test.canvas.startRain();
                 
         }
         
}

2 个回复

倒序浏览
支持黑马,黑马最强
回复 使用道具 举报 1 0
支持一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马