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