Swing容器组件的显示效果

开发 后端
本文介绍Swing容器组件的显示效果,使用Renderer渲染机制,在容器的paint方法中设置图形对象的透明属性,就可以实现Swing容器组件自身和子组件的透明渲染。

其实有很多用户界面效果在Swing中是相当容易实现的。前面曾谈到过淡入淡出式弹出Swing Popup窗口,其实对于任何Swing容器组件而言都可以实现这一功能。使用Renderer渲染机制,在容器的paint方法中设置图形对象的透明属性,就可以实现Swing容器组件自身和子组件的透明渲染。如果再将这个过程渐变化,就能实现容器显示淡入淡出效果。

本文的演示使用下面几行代码就实现了容器显示的淡入淡出效果:

  1. /**  
  2.  * 淡入淡出式显示内容组件的容器  
  3.  * @author William Chen  
  4.  */  
  5. public class GlassBox extends JComponent implements ActionListener{  
  6.     //常数定义  
  7.     private static final int ANIMATION_FRAMES=50;  
  8.     private static final int ANIMATION_INTERVAL=10;  
  9.     //帧索引  
  10.     private int frameIndex;  
  11.     //时钟  
  12.     private Timer timer;  
  13.      
  14.     /** Creates a new instance of GlassBox */  
  15.     public GlassBox() {  
  16.     }  
  17.      
  18.     public void paint(Graphics g){  
  19.         if(isAnimating()){  
  20.             //根据当前帧显示当前透明度的内容组件  
  21.             float alpha=(float)frameIndex/(float)ANIMATION_FRAMES;  
  22.             Graphics2D g2d=(Graphics2D)g;  
  23.             g2d.setComposite(AlphaComposite.getInstance
    (AlphaComposite.SRC_OVER, alpha));  
  24.             //Renderer渲染机制  
  25.             super.paint(g2d);  
  26.         }else{  
  27.             //如果是***次,启动动画时钟  
  28.             frameIndex=0;  
  29.             timer=new Timer(ANIMATION_INTERVAL, this);  
  30.             timer.start();  
  31.         }  
  32.     }  
  33.     //判断当前是否正在进行动画  
  34.     private boolean isAnimating(){  
  35.         return timer!=null && timer.isRunning();  
  36.     }  
  37.     //关闭时钟,重新初始化  
  38.     private void closeTimer() {  
  39.         if(isAnimating()){  
  40.             timer.stop();  
  41.             frameIndex=0;  
  42.             timer=null;  
  43.         }  
  44.     }  
  45.     //动画时钟处理事件  
  46.     public void actionPerformed(ActionEvent e) {  
  47.         //前进一帧  
  48.         frameIndex++;  
  49.         if(frameIndex>=ANIMATION_FRAMES)  
  50.             //***一帧,关闭动画  
  51.             closeTimer();  
  52.         else//更新当前一帧  
  53.             repaint();  
  54.     }  
  55. }  

将GlassBox类作为JFrame的ContentPane就能实现窗口内容显示的淡入淡出效果。GlassBox更常见的使用方式是作为普通容器,放在应用程序的任何地方。本文附带的演示程序是将GlassBox是作为普通容器加入JFrame的ContentPane内的。

Swing灵活强大的扩展和自定义功能得益于其优秀的模型和架构设计。如果程序是仅局限于用几个Label和Button等堆砌起来的简单应用,你很难体会到Swing容器组件的优点,反而会因为它的灵活复杂觉得它不如SWT等编写简单。然而在你面对现实应用中的复杂、灵活多变的界面需求时,Swing的能力就逐步显现了出来了。

【编辑推荐】

  1. Swing应用的数据验证
  2. 浅谈Swing和SWT比较
  3. 应该改进的Java Swing 2.0
  4. 浅析Swing Set示例
  5. Swing中的JFormattedTextField组件实例
责任编辑:佚名 来源: 中国IT实验室
相关推荐

2009-07-15 11:02:32

Swing组件

2009-07-14 17:21:42

Swing组件

2009-07-10 16:29:32

Swing组件

2009-07-15 13:06:38

Swing组件

2012-01-17 14:29:38

JavaSwing

2009-07-10 10:19:57

JFormattedTSwing

2009-07-10 13:36:32

Swing容器

2009-07-10 18:06:59

JTree Swing

2009-07-17 12:54:13

2009-07-15 10:52:13

JTree组件

2009-07-10 14:58:13

JLabel组件JFC和Swing

2009-07-17 11:13:46

AWT和SwingSwing组件

2009-07-10 12:30:12

Swing组件

2012-01-17 13:41:34

JavaSwing

2009-07-10 10:08:59

Spinner ModSwing组件

2009-07-14 18:05:28

轻量级Swing组件

2009-07-10 17:03:17

AWT组件Swing组件

2009-07-17 14:38:51

轻量级Swing组件

2009-07-17 10:31:18

paint方法Swing组件

2009-07-16 10:11:06

渲染器RendererSwing组件
点赞
收藏

51CTO技术栈公众号