Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 388|回复: 0

[Swing学习]JAVA Swing渐显效果

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-17 23:57:57 | 显示全部楼层 |阅读模式
    能不能让Swing控件也有渐隐和渐显的效果呢,答案当然是肯定的。这里也要说明一下Swing这些高级特性的实现机制。Swing里的特效不是靠调用一 个方法就可以实现的,而是要我们自己去写这些方法,主要还是重写Swing的public void paint(Graphics g)方法。Swing的一切样式说白了都是利用paint方法“画”上去的,所以说Swing比较慢,当然如果我们考虑Swing主要用来做客户端显示 的,稍微慢一点也是可以接受的。
       

       
    下面说Swing的控件的渐显效果,我想原理还是蛮简单的,不断改变控件的透明度即可。即g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
       
    下面是完整的控件代码,该控件您可以认为是一个类似JPanel的容器:
       

       

         
          
          
           java代码  
          
          
          
          
          package com.zakisoft.frame;   
             
          import java.awt.AlphaComposite;   
          import java.awt.Graphics;   
          import java.awt.Graphics2D;   
          import java.awt.event.ActionEvent;   
          import java.awt.event.ActionListener;   
          import java.awt.image.BufferedImage;   
          import java.io.FileInputStream;   
          import java.io.FileNotFoundException;   
          import java.io.IOException;   
             
          import javax.imageio.ImageIO;   
          import javax.swing.Timer;   
             
             
          /**  
           * @author zakisoft.com  
           *  
           */   
          public class ZPanel extends javax.swing.JComponent implements ActionListener {   
             
              private static final long serialVersionUID = 1L;   
              private BufferedImage image;   
             
              private static final int ANIMATION_FRAMES = 100;   
              private static final int ANIMATION_INTERVAL = 10;   
                
              private int frameIndex;   
              // 时钟   
              private Timer timer;   
             
              public BufferedImage getImage() {   
                  return image;   
              }   
             
              public void setImage(BufferedImage image) {   
                  this.image = image;   
              }   
             
              private int imgWidth;   
              private int imgHeight;   
             
              public int getImgWidth() {   
                  return imgWidth;   
              }   
             
              public void setImgWidth(int imgWidth) {   
                  this.imgWidth = imgWidth;   
              }   
             
              public int getImgHeight() {   
                  return imgHeight;   
              }   
             
              public void setImgHeight(int imgHeight) {   
                  this.imgHeight = imgHeight;   
              }   
             
              public ZPanel() {   
              }   
             
              public void setImagePath(String imgPath) {   
                  // 该方法不推荐使用,该方法是懒加载,图像并不加载到内存,当拿图像的宽和高时会返回-1;   
                  // image = Toolkit.getDefaultToolkit().getImage(imgPath);   
                  try {   
                      // 该方法会将图像加载到内存,从而拿到图像的详细信息。   
                      image = ImageIO.read(new FileInputStream(imgPath));   
                  } catch (FileNotFoundException e) {   
                      e.printStackTrace();   
                  } catch (IOException e) {   
                      e.printStackTrace();   
                  }   
                  setImgWidth(image.getWidth(this));   
                  setImgHeight(image.getHeight(this));   
              }   
             
              public void paintComponent(Graphics g) {   
                  int x = 0;   
                  int y = 0;   
                  if (null == image) {   
                      return;   
                  }   
                  g.drawImage(image, x, y, image.getWidth(null), image.getHeight(null),   
                          null);   
              }   
             
              public void paint(Graphics g) {   
                  if (isAnimating()) {   
                      // 根据当前帧显示当前透明度的内容组件   
                      float alpha = (float) frameIndex / (float) ANIMATION_FRAMES;   
                      Graphics2D g2d = (Graphics2D) g;   
                      g2d.setComposite(AlphaComposite.getInstance(   
                              AlphaComposite.SRC_OVER, alpha));   
                      // Renderer渲染机制   
                      super.paint(g2d);   
                  } else {   
                      // 如果是第一次,启动动画时钟   
                      frameIndex = 0;   
                      timer = new Timer(ANIMATION_INTERVAL, this);   
                      timer.start();   
                  }   
              }   
             
              // 判断当前是否正在进行动画   
              private boolean isAnimating() {   
                  return timer != null && timer.isRunning();   
              }   
             
              // 关闭时钟,重新初始化   
              private void closeTimer() {   
                  if (isAnimating()) {   
                      timer.stop();   
                      frameIndex = 0;   
                      timer = null;   
                  }   
              }   
             
              // 动画时钟处理事件   
              public void actionPerformed(ActionEvent e) {   
                  // 前进一帧   
                  frameIndex++;   
                  if (frameIndex >= ANIMATION_FRAMES)   
                      // 最后一帧,关闭动画   
                      closeTimer();   
                  else   
                      // 更新当前一帧   
                      repaint();   
              }   
          }   
          
         
       
    我们利用控件的public void paint(Graphics g) 方法,来设置控件的透明度,然后利用super.paint(g2d)方法重绘页面;重绘时系统会自动调用public void actionPerformed(ActionEvent e) 方法,我们在这里来改变控件的透明度,并且判断控件是否加载完毕,加载完毕就停止计时器。
       

       
    很简单,效果还不错吧,附件是完整的运行代码。按“图片渐显”按钮,可以反复查看效果。
       

       
    下图是加载时界面:
       

       
       
    下图是加载完成界面:
       

       
       

       
    文章地址:
        http://javapub.iteye.com/blog/759567
       

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/17/235757625.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:32 , Processed in 0.353255 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表