资料来源:https://www.bilibili.com/video/BV1Aq4y1W79E?p=5&spm_id_from=pageDriver
package cn.tx.snow;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.net.URL;import java.util.Objects;public class MyImage extends JPanel{// 定义成员图片对象。当前窗口显示的图片BufferedImage bgImage;public static void main(String[] args) throws IOException {// 创建窗口JFrame frame = new JFrame();// 设置窗体大小frame.setSize(800,1800);// 设置标题frame.setTitle("Java版电子相册");// 设置窗体居中显示frame.setLocationRelativeTo(null);// 关闭窗口,把JVM停止frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 创建面板对象// JPanel jPanel = new JPanel();MyImage myImage = new MyImage();// 把面板对象存放到窗口上frame.add(myImage);// 调用初始化图片的方法myImage.initImgs();// 把图片画到窗口上去,调用绘图的方法// 重绘,底层调用的是paint方法// myImage.repaint();// 写方法。让ff一直变化,开启新的线程myImage.begin();// 显示出窗口frame.setVisible(true);}// 设置图片显示比例值float ff = 20f;// 声明数组的下标int num = 0;// 让ff的值一直变化,方法执行结束,整个线程就执行结束public void begin(){new Thread(new Runnable() {// 启动线程@Overridepublic void run() {// 一直去改变ff的值,使图片越来越清晰while (true){// 从数组中获取图片bgImage = images[num];// 让num累加num ++;// 考虑数组越界异常if(num == images.length - 1){num = 0;}while (true){if(ff < 100f){ff += 1f;// 调用重绘方法。慢慢绘制图片,图片越来越清晰repaint();}else {ff = 0f;break; // 跳出循环,方法执行结束,整个线程就执行结束}try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();}// 需要重写父类的方法。提供绘图的方法。ctrl + o:打开重写方法@Overridepublic void paint(Graphics g) {super.paint(g);// Graphics转换为子类对象,子类提供了更多的方法Graphics2D graphics2D = (Graphics2D) g;if(bgImage != null){// 加入淡入效果,设置图片的显示比例(模糊度)graphics2D.setComposite(AlphaComposite.SrcOver.derive(ff / 100f));// 把图片画到窗口上。0,0表示从最左上角开始画graphics2D.drawImage(bgImage,0,0, bgImage.getWidth(), bgImage.getHeight(),null);}}// 定义图片类型数组// BufferedImage:表示图片对象BufferedImage[] images = new BufferedImage[9];/*** 加载提前准备好的一些图片*/public void initImgs() throws IOException {for (int i = 0; i < images.length; i++) {// 每循环异常,都要加载一张图片 /main/java/cn/tx/snow/images/bg" + i + ".pngURL url = MyImage.class.getResource("main/java/cn/tx/snow/images/bg" + i + ".png"); // 返回nullFile file = new File("src/main/java/cn/tx/snow/images/img_" + i + ".png");URL url1 = file.toURL();BufferedImage image = ImageIO.read((Objects.requireNonNull(url1)));// 每读取到一张图片对象,把它存放到数组中images[i] = image;}}}
