能不能让Swing控件也有渐隐和渐显的效果呢,答案当然是肯定的。这里也要说明一下Swing这些高级特性的实现机制。Swing里的特效不是靠调用一个方法就可以实现的,而是要我们自己去写这些方法,主要还是重写Swing的public void paint(Graphics g)方法。Swing的一切样式说白了都是利用paint方法“画”上去的,所以说Swing比较慢,当然如果我们考虑Swing主要用来做客户端显示的,稍微慢一点也是可以接受的。
创新互联成立10年来,这条路我们正越走越好,积累了技术与客户资源,形成了良好的口碑。为客户提供网站设计、成都做网站、网站策划、网页设计、国际域名空间、网络营销、VI设计、网站改版、漏洞修补等服务。网站是否美观、功能强大、用户体验好、性价比高、打开快等等,这些对于网站建设都非常重要,创新互联通过对建站技术性的掌握、对创意设计的研究为客户提供一站式互联网解决方案,携手广大客户,共同发展进步。
下面说Swing的控件的渐显效果,我想原理还是蛮简单的,不断改变控件的透明度即可。即g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
下面是完整的控件代码,该控件您可以认为是一个类似JPanel的容器:
- 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) 方法,我们在这里来改变控件的透明度,并且判断控件是否加载完毕,加载完毕就停止计时器。
很简单,效果还不错吧,附件是完整的运行代码。按“图片渐显”按钮,可以反复查看效果。
下图是加载时界面:
下图是加载完成界面:
本文名称:Swing特效:渐显效果
本文链接:http://www.shufengxianlan.com/qtweb/news46/306446.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联