资料来源:https://www.bilibili.com/video/BV1Aq4y1W79E?p=5&spm_id_from=pageDriver

    1. package cn.tx.snow;
    2. import javax.imageio.ImageIO;
    3. import javax.swing.*;
    4. import java.awt.*;
    5. import java.awt.image.BufferedImage;
    6. import java.io.File;
    7. import java.io.IOException;
    8. import java.net.URL;
    9. import java.util.Objects;
    10. public class MyImage extends JPanel{
    11. // 定义成员图片对象。当前窗口显示的图片
    12. BufferedImage bgImage;
    13. public static void main(String[] args) throws IOException {
    14. // 创建窗口
    15. JFrame frame = new JFrame();
    16. // 设置窗体大小
    17. frame.setSize(800,1800);
    18. // 设置标题
    19. frame.setTitle("Java版电子相册");
    20. // 设置窗体居中显示
    21. frame.setLocationRelativeTo(null);
    22. // 关闭窗口,把JVM停止
    23. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    24. // 创建面板对象
    25. // JPanel jPanel = new JPanel();
    26. MyImage myImage = new MyImage();
    27. // 把面板对象存放到窗口上
    28. frame.add(myImage);
    29. // 调用初始化图片的方法
    30. myImage.initImgs();
    31. // 把图片画到窗口上去,调用绘图的方法
    32. // 重绘,底层调用的是paint方法
    33. // myImage.repaint();
    34. // 写方法。让ff一直变化,开启新的线程
    35. myImage.begin();
    36. // 显示出窗口
    37. frame.setVisible(true);
    38. }
    39. // 设置图片显示比例值
    40. float ff = 20f;
    41. // 声明数组的下标
    42. int num = 0;
    43. // 让ff的值一直变化,方法执行结束,整个线程就执行结束
    44. public void begin(){
    45. new Thread(new Runnable() {
    46. // 启动线程
    47. @Override
    48. public void run() {
    49. // 一直去改变ff的值,使图片越来越清晰
    50. while (true){
    51. // 从数组中获取图片
    52. bgImage = images[num];
    53. // 让num累加
    54. num ++;
    55. // 考虑数组越界异常
    56. if(num == images.length - 1){
    57. num = 0;
    58. }
    59. while (true){
    60. if(ff < 100f){
    61. ff += 1f;
    62. // 调用重绘方法。慢慢绘制图片,图片越来越清晰
    63. repaint();
    64. }else {
    65. ff = 0f;
    66. break; // 跳出循环,方法执行结束,整个线程就执行结束
    67. }
    68. try {
    69. Thread.sleep(50);
    70. } catch (InterruptedException e) {
    71. e.printStackTrace();
    72. }
    73. }
    74. }
    75. }
    76. }).start();
    77. }
    78. // 需要重写父类的方法。提供绘图的方法。ctrl + o:打开重写方法
    79. @Override
    80. public void paint(Graphics g) {
    81. super.paint(g);
    82. // Graphics转换为子类对象,子类提供了更多的方法
    83. Graphics2D graphics2D = (Graphics2D) g;
    84. if(bgImage != null){
    85. // 加入淡入效果,设置图片的显示比例(模糊度)
    86. graphics2D.setComposite(AlphaComposite.SrcOver.derive(ff / 100f));
    87. // 把图片画到窗口上。0,0表示从最左上角开始画
    88. graphics2D.drawImage(bgImage,0,0, bgImage.getWidth(), bgImage.getHeight(),null);
    89. }
    90. }
    91. // 定义图片类型数组
    92. // BufferedImage:表示图片对象
    93. BufferedImage[] images = new BufferedImage[9];
    94. /**
    95. * 加载提前准备好的一些图片
    96. */
    97. public void initImgs() throws IOException {
    98. for (int i = 0; i < images.length; i++) {
    99. // 每循环异常,都要加载一张图片 /main/java/cn/tx/snow/images/bg" + i + ".png
    100. URL url = MyImage.class.getResource("main/java/cn/tx/snow/images/bg" + i + ".png"); // 返回null
    101. File file = new File("src/main/java/cn/tx/snow/images/img_" + i + ".png");
    102. URL url1 = file.toURL();
    103. BufferedImage image = ImageIO.read((Objects.requireNonNull(url1)));
    104. // 每读取到一张图片对象,把它存放到数组中
    105. images[i] = image;
    106. }
    107. }
    108. }