Java电子相册

一,功能展示

利用JFrame实现基本窗口及绘制图片,再利用多线程实现切换图片时的淡入淡出效果。

二,注意事项

1,目录结构

2,图片小于等于24位颜色,否则显式不出

三,代码实现

1,Windows,实现窗口相关操作

package code;

import javax.swing.*;

public class Windows{
    public JFrame frame=new JFrame();
    public void setFrame(){
        //设置窗口大小
        frame.setSize(1000,600);
        //设置标题
        frame.setTitle("电子相册");
        //居中显式
        frame.setLocationRelativeTo(null);
        //关闭窗口是把JVM也停止
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

2,PhotoAlbum,实现相册相关操作

package code;

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

public class PhotoAlbum extends JPanel {
    //定义成员图片对象变量
    private BufferedImage bgimage;
    //标志,表示数组的下标索引
    private int num=0;
    //图片显式的比例值(清晰度)
    private float ff=20f;
    //定义图片类型的数组
    private BufferedImage[] images=new BufferedImage[4];

    //加载提前准备好的一些图片
    public void initImage() throws IOException {
        for(int i=1;i<=4;i++){
            //每循环一次,都加载一张图片
            //反射机制
            BufferedImage image= ImageIO.read(MyImage.class.getResource("/images/"+i+".jpg"));
            //每读取到一张图片对象,把他存在数组中
            images[i-1]=image;
        }
        //给成员变量赋值
        bgimage=images[0];
    }

    //需要重写父类方法,因为父类提供绘图的方法。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,1000,600,null);//长宽和窗口保持一致,实现图片自适应
        }
    }

    public void begin(){
        //启动线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                //改变图片
                while(true){
                    //从数组中获取图片
                    bgimage=images[num];
                    //让num累加
                    num++;
                    //考虑数组越界的异常
                    if(num==4){
                        num=0;
                    }

                    //让ff的值一直变,实现淡入淡出的效果
                    while(true){
                        if (ff<100f){
                            ff+=2f;
                            //调用重新绘制方法
                            repaint();
                        }else{//ff>=100f
                            ff=0f;
                            break;//跳出当前循环,返回上层循环,切换图片
                        }
                        //休眠让淡入淡出的效果更加明显
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }).start();
    }
}

3,MyImage,函数的调用

package code;

import javax.swing.*;
import java.io.IOException;
import java.net.InetSocketAddress;


public class MyImage extends JPanel{
    public static void main(String[] args) throws IOException {

        Windows windows= new Windows();
        windows.setFrame();

        //创建相册的对象
        PhotoAlbum photoAlbum =new PhotoAlbum();
        //调用初始化图片的方法
        photoAlbum.initImage();
        //把面板图像放到窗口上
        windows.frame.add(photoAlbum);
        //开启新的线程,用来改变图片的清晰度
        photoAlbum.begin();

        //设置窗口可见
        windows.frame.setVisible(true);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值