中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 用户界面
淡入淡出J.UI
作者:未知 时间:2005-07-24 21:16 出处:JR 责编:chinaitpower
              摘要:淡入淡出J.UI

淡入:Fade in,指画面从100%透明逐渐变化到100%不透明,视觉效果就是渐渐出现;
淡出:Fade out,指画面从100%不透明逐渐变化到100%不透明,视觉效果就是渐渐消失;
J.UI : Java GUI,这里指的就是Java Swing组件。
本文讲述如何在Java Swing组件上实现淡入淡出的效果。

『基本原理』

该效果的基本原理是利用Java2D里面引入的AlphaComposite类来设置组件的图形定制方法JComponent.paintComponent(Graphics g)中g的透明度。Graphics这个类并没有AlphaComposite这个属性,因此,设置之前,要先把g转型成为一个Graphics2D的对象,然后可以用Graphics2D.setComposite(AlphaComposite comp)来设置透明度。一般来说,对于swing组件,如果要定制其图形,先把Graphics的对象转型成为Graphics2D的对象也是一个常用的技巧,以便利用Graphics2D中引入的一些方法。当然,要实现透明度的逐渐改变,还需要一个线程不断的对透明度进行设置,并且更新画面。

下面这段简单的代码表明如何利用线程和AlphaComposite来实现淡入的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class FFrame extends JFrame {
 
    private final FComponent fc = new FComponent();
    private Image image = new ImageIcon("pudong.jpg").getImage(); // initialize some image here
 
    class FComponent extends JComponent {
        float alpha = 0.0f;
        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            AlphaComposite comp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
            g2d.setComposite(comp);
            g2d.drawImage(image, 0, 0, this);
        }
    }
 
    class FController implements Runnable {
        public void run() {
            try {
                Thread.sleep(500); // pause for 0.5 sec first
                while (true) {
                    for (int i=0; i<=50; i++) {
                        fc.alpha = ((float) i) / 50;
                        Thread.sleep(50);
                        fc.repaint();
                    } // end for
                } // end while
            } catch (InterruptedException e) {
            }
        }
    }
 
    public FFrame() {
        Dimension psize = new Dimension(640, 380);  // set to some proper size to fit the image
        fc.setPreferredSize(psize);
 
        JPanel panel = new JPanel();
        panel.add(fc);
        this.getContentPane().add(panel);
 
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(700, 440);
        this.setLocationRelativeTo(null);         // center on screen
 
        this.addWindowListener(new WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                new Thread(new FController()).start();
            }
        });
    }
 
    public static void main(String args[]) {
        new FFrame().setVisible(true);
    }
 
}

第10到第18行定义了一个FComponent的类,里面通过override JComponent的paintComponent的方法定制其图形。alpha是一个变量,在paintComponent里面被用到,控制图形的透明度。控制淡入淡出的线程(FController)就是通过改变alpha的值,然后调用repaint方法实现透明度的渐变的。这段是写在第20到到第34行的。控制线程是在主窗口第一次被打开(windowOpened event)时候被创建并开始执行的,见第50行。 由于FComponent是一个自定义的组件,所以最好设置(根据所用的LayoutManager)其preferredSize。

『FadeComponent』

笔者写了一个FadeComponent的类,extends JComponent implements Runnable,另外加入一些Bean Pattern的方法,也就是set/get一些淡入淡出的参数,比如循环次数,渐变的步骤数目等等。关于这个类的用法,笔者上传了一个demo的应用程序在附件中,是一个jar文件,用j2se1.4.2_05编译打包,包含源代码和class文件,可直接运行。如果由于JRE版本问题不能运行可以用解压缩软件提取出源代码编译运行。这个demo有详细的解释,并且包含有FadeComponent的API文档。


附件:FadeJUIDemo_1.4.2_05.jar(68K) 
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有