Swing容器組件的顯示效果
其實有很多用戶界面效果在Swing中是相當容易實現(xiàn)的。前面曾談到過淡入淡出式彈出Swing Popup窗口,其實對于任何Swing容器組件而言都可以實現(xiàn)這一功能。使用Renderer渲染機制,在容器的paint方法中設(shè)置圖形對象的透明屬性,就可以實現(xiàn)Swing容器組件自身和子組件的透明渲染。如果再將這個過程漸變化,就能實現(xiàn)容器顯示淡入淡出效果。
本文的演示使用下面幾行代碼就實現(xiàn)了容器顯示的淡入淡出效果:
- /**
 - * 淡入淡出式顯示內(nèi)容組件的容器
 - * @author William Chen
 - */
 - public class GlassBox extends JComponent implements ActionListener{
 - //常數(shù)定義
 - private static final int ANIMATION_FRAMES=50;
 - private static final int ANIMATION_INTERVAL=10;
 - //幀索引
 - private int frameIndex;
 - //時鐘
 - private Timer timer;
 - /** Creates a new instance of GlassBox */
 - public GlassBox() {
 - }
 - public void paint(Graphics g){
 - if(isAnimating()){
 - //根據(jù)當前幀顯示當前透明度的內(nèi)容組件
 - 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();
 - }
 - //關(guān)閉時鐘,重新初始化
 - private void closeTimer() {
 - if(isAnimating()){
 - timer.stop();
 - frameIndex=0;
 - timer=null;
 - }
 - }
 - //動畫時鐘處理事件
 - public void actionPerformed(ActionEvent e) {
 - //前進一幀
 - frameIndex++;
 - if(frameIndex>=ANIMATION_FRAMES)
 - //***一幀,關(guān)閉動畫
 - closeTimer();
 - else//更新當前一幀
 - repaint();
 - }
 - }
 
將GlassBox類作為JFrame的ContentPane就能實現(xiàn)窗口內(nèi)容顯示的淡入淡出效果。GlassBox更常見的使用方式是作為普通容器,放在應(yīng)用程序的任何地方。本文附帶的演示程序是將GlassBox是作為普通容器加入JFrame的ContentPane內(nèi)的。
Swing靈活強大的擴展和自定義功能得益于其優(yōu)秀的模型和架構(gòu)設(shè)計。如果程序是僅局限于用幾個Label和Button等堆砌起來的簡單應(yīng)用,你很難體會到Swing容器組件的優(yōu)點,反而會因為它的靈活復(fù)雜覺得它不如SWT等編寫簡單。然而在你面對現(xiàn)實應(yīng)用中的復(fù)雜、靈活多變的界面需求時,Swing的能力就逐步顯現(xiàn)了出來了。
【編輯推薦】















 
 
 
 
 
 
 