Java电子相册

package com.company;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

/*1.弄明白要干什么?;2.怎么做?即实现的思路,慢慢培养,通过记笔记,写注释等方法;3.填代码(有一些方法可以查看文档,视频,或者查看源码);4.完整代码实现,调试bug*/
/*培养自己的思路,思想*/

/*电子相册*/
public class MyImage extends JPanel
{
    //定义一个成员图片对象
    static BufferedImage bgImage;  //表示当前窗口正在显示的一张图片

    public static void main(String[] args) {
        //创建一个窗口
        JFrame frame = new JFrame();
        //设置大小
        frame.setSize(1366,768);
        //设置标题
        frame.setTitle("Java版的电子相册");
        //居中显示窗口
        frame.setLocationRelativeTo(null);
        //关闭窗口,JVM关闭
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //值是固定的为3

        //**************将图片显示在窗口上,相当于给图片设置一个背景**************
        //创建一个面板对象
        //JPanel jPanel = new JPanel();
        MyImage myImage = new MyImage();
        //把面板对象存放在窗口上
        //frame.add(jPanel);  //窗口上放了面板
        frame.add(myImage);
        //初始化图片的方法
        myImage.initImages();
        //把图片画到窗口上,调用绘图方法
        //重绘
        myImage.repaint();

        //写一个方法,让ff一直变,开启新的线程
        myImage.begin();

        //显示窗口
        frame.setVisible(true);
    }

    //标志,表示图片数组下标的索引
    int num = 0;

    /*让ff的值一直变,淡入效果实现*/
    public void begin(){
        //启动线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                //一直改变ff的值
                while(true){
                    //从数组中取图片
                    bgImage = images[num];
                    //让num累加
                    num++;
                    //考虑数组越界异常
                    if(num == 4){
                        num = 0;
                    }
                    while(true){ //慢慢显示图片
                        if(ff < 100f){
                            ff += 2f;
                            //调用重绘方法
                            repaint();
                        } else{
                            ff = 0f;
                            break;
                        }
                        //加休眠
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }

    //图片显示比例
    static float ff = 0f;

    //需要重写父类的绘图方法,提供绘图的方法。ctrl+o
    //Graphics g  画笔  画图片
    @Override
    public void paint(Graphics g) {
        super.paint(g);

        //转换成子类对象,提供了更多的方法
        Graphics2D graphics2D = (Graphics2D) g;

        //画什么?
        if(bgImage != null){
            //加入淡入效果
            graphics2D.setComposite(AlphaComposite.SrcOver.derive(ff / 100f));  //变比列达到淡入效果
            //把图片画到窗口上去
            g.drawImage(bgImage,0,0,bgImage.getWidth(),bgImage.getHeight(),null);  //从左上角画
        }
    }

    //定义图片类型的数组
    static BufferedImage [] images = new BufferedImage[4];  //BufferedImage图片类


    /*加载提前准备好的一些图片*/
    public static void initImages()
    {
        try
        {
            //编写for循环
            for (int i=1; i<=4; i++)
            {
                //每循环一次,都需要加载一张图片
                BufferedImage image = ImageIO.read(MyImage.class.getResource("/images/bg" + i + ".jpg"));  //点击try...catch...环绕
                //每读取到一张图片对象,把它存放在数组中
                images[i-1] = image;  //图片数组下标减一=逻辑图片位置
            }

            //给成员变量赋值
            bgImage = images[0];
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

注:需要读者自己准备images图片包,上文中以4张图片为例!
初做Java小项目,难免会有问题,希望能够能够得到批评指正,谢谢!