24-java代码雨

RainCanvas.java

import java.awt.*;
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);
	}
}
Test.java

import javax.swing.JFrame;

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();
	}
}



  • 16
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会编程的阿强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值