java swing 雪花_Java:JFrame使用setBackground实现透明背景的雪花屏保

本文展示了如何使用Java Swing创建一个带有透明背景的雪花屏保。通过设置JFrame和JPanel的背景颜色为透明,并利用Graphics2D进行雪花的绘制和旋转,实现了动态的雪花飘落效果。代码在JDK1.8环境下运行正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上效果图:

a2b8dbe54b6915cbe75f1cbd167774d9.png

Java代码:

import com.sun.awt.AWTUtilities;

import javax.imageio.ImageIO;

import javax.swing.*;

import java.awt.*;

import java.io.IOException;

import java.io.InputStream;

//这2句是核心

//frame.setBackground(new Color(0,0,0,0));

//pane.setBackground(new Color(0,0,0,0));

//这句写上后没有效果,不知道为什么,jdk1.8

//AWTUtilities.setWindowOpaque(frame, false);

public class t4 {

public static void main(String[] args) {

new t4();

}

public t4(){

start();

}

public static void start() {

final JFrame frame = new JFrame();

frame.setAlwaysOnTop(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setUndecorated(true);

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

//这句写上后没有效果,不知道为什么,jdk1.8

//AWTUtilities.setWindowOpaque(frame, false);

//设置透明背景1,重要

frame.setBackground(new Color(0,0,0,0));

final JPanel pane = new JPanel() {

private int[] snowX = null;

private int[] snowY = null;

private int[] angles = null;

private int count = 50;

@Override

public void paint(Graphics g) {

super.paint(g);

Rectangle bounds = frame.getBounds();

if (snowX == null) {

snowX = new int[count];

for (int i = 0; i < snowX.length; i++) {

snowX[i] = getRandomInt(bounds.width);

}

snowY = new int[count];

for (int i = 0; i < snowY.length; i++) {

snowY[i] = getRandomInt(bounds.height);

}

angles = new int[count];

for (int i = 0; i < snowY.length; i++) {

angles[i] = getRandomInt(360);

}

}

Graphics2D g2d = (Graphics2D) g;

InputStream imgIS = this.getClass().getResourceAsStream("snow.png");

Image image = null;

try {

image = ImageIO.read(imgIS);

} catch (IOException e) {

e.printStackTrace();

}

for (int i = 0; i < count; i++) {

//snowX[i] += getRandomInt(5) - 3;

snowY[i] += 5;

angles[i] += i / 5;

snowY[i] = snowY[i] > bounds.height ? 0 : snowY[i];

angles[i] = angles[i] > 360 ? 0 : angles[i];

int x = snowX[i];

int y = snowY[i];

int angle = angles[i];

g2d.translate(x, y);

double angleValue = Math.toRadians(angle);

g2d.rotate(angleValue);

g2d.drawImage(image, 0, 0, null);

g2d.rotate(-angleValue);

g2d.translate(-x, -y);

}

}

};

//设置透明背景2,重要

pane.setBackground(new Color(0,0,0,0));

//这里不设置了

//frame.setContentPane(pane);

frame.setVisible(true);

Thread thread = new Thread() {

@Override

public void run() {

while (true) {

try {

//这里设置一次

frame.setContentPane(pane);

Thread.sleep(10);

//然后移除

frame.remove(pane);

} catch (Exception ex) {

ex.printStackTrace();

}

//然后重画

pane.repaint();

}

}

};

thread.start();

}

public static int getRandomInt(int width) {

int i = 0;

double d = Math.random() * width;

i = (int)d;

return i;

}

}

需要的雪花图片(应该是没有背景的png才对):

8e0bb4c558456b589595d63ace3589f8.png

说明:

直接复制代码就可以用了,本人是jdk1.8的环境,没有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值