package cn.demo2; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; /** * 电子相册 */ public class MyImage extends JPanel{ //定义一个成员变量 BufferedImage bgImage; public static void main(String[] args) { //创建一个窗口 JFrame frame=new JFrame(); //设置一个窗口 frame.setSize(450,750); //设置标题 frame.setTitle("JAVA电子版相册"); //让窗口居中显示 // frame.setLocation(300,40); frame.setLocationRelativeTo(null); //关闭窗口时关闭JVM,否则只是单方面关闭窗口,程序还在运行 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //创建面板对象 MyImage myImage=new MyImage(); //把面板放到窗口上 frame.add(myImage); //调用初始化对象存放到窗口 myImage.initImags(); //把图片画到窗口上去,调用绘图方法 //重绘 // myImage.repaint(); // TODO 写方法让 ff 一直变 , 开启新的线程,用来该值 myImage.become(); //显示出这一个窗口 frame.setVisible(true); } float ff=0f; int num=0; //数组下标索引值 //TODO 写方法让 ff 变量一直变 public void become(){ //启动一个线程 new Thread(new Runnable() { @Override public void run() { //一直去改变ff的值 while (true){ //从数组中获取照片 bgImage=images[num]; num+=1; //考虑数组越界 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(); } //需要重写父类的方法 提供一个绘图方法 @Override public void paint(Graphics g) { super.paint(g); /** * 做图片效果,淡入 */ //转换成子类对象,提供了更多的方法 Graphics2D graphics2D= (Graphics2D) g; //强转 //画什么东西 if(bgImage!=null){ //加入淡入效果 graphics2D.setComposite(AlphaComposite.SrcOver.derive(ff/100f)); //把这张图片画到窗口上去 G g.drawImage(bgImage,0,0,bgImage.getWidth(),bgImage.getHeight(),null); } } //TODO.1. **存照片** 定义图片类型数组 BufferedImage表示图片对象 BufferedImage [] images=new BufferedImage[4]; /** * 加载准备好的一些图片 */ public void initImags(){ try { //编写一个for循环 for (int i = 1; i <= 4; i++) { //每循环一次都要去加载一张图片 BufferedImage image = ImageIO.read(MyImage.class.getResource("/cn/demo2/image/" + i + ".jpg")); //没读取到一张图片对象,把他存放到我们的数组中 images[i-1]=image; } //给成员变量赋值 TODO 换照片 bgImage=images[1]; } catch (IOException e) { e.printStackTrace(); } } }
结果