在这个程序的实现中最主要有以下几点:
- 实现JFrame窗口透明到桌面
- 启用多线程实现屏保重画
- 设置鼠标监听,可以实现鼠标一动就退出屏保
实现了以上两点,代码如下:
- 窗口类
import javax.swing.JFrame;
import com.sun.awt.AWTUtilities;//实现窗口透明很重要的一个包
public class MyJFrame extends JFrame{
public MyJFrame(){
this.setSize(1366, 768);//设置大小,即当前分辨率,可以手动设置,也可以自动获取
this.setUndecorated(true);//禁用或启动用此JFrame装饰
this.setLocationRelativeTo(null);//默认窗口居中对齐
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);设置用户在此窗体上发起 "close" 时默认执行的操作
MyJPanel p = new MyJPanel();
AWTUtilities.setWindowOpaque(this, false);//flase设置透明反之不透明
this.add(p);
p.setBackground(null); //将背景色设置为空
p.setOpaque(false);//将背景设置为透明
this.setVisible(true);
p.move();//调用用线程实现的画布移动功能
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.addMouseMotionListener(p);//注册鼠标监听器
}
public static void main(String[] args) {
new MyJFrame();
}
}
2.画布类
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import javax.swing.*;
public class MyJPanel extends JPanel implements MouseMotionListener{
@Override
public void paint(Graphics g) {
Image image = new ImageIcon("snowflower.png").getImage();
Random r = new Random();//利用随机数来控制屏保出现位置
for(int i = 0; i < 30; i++){
int x = r.nextInt(1366)-50;
int y = r.nextInt(768) - 50;
g.drawImage(image, x, y, null);
}
}
public void move(){
new Thread(){//新建一个线程
public void run(){
while(true){
repaint();//重画,实现画布移动效果
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
//重写,监听到此动作,执行以下语句退出程序
System.exit(0);
}
}