一,功能展示
利用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);
}
}