Do you drink java?



                像寫情書一樣coding

           

          AWT中圖像的異步加載和等待圖像的完全加載

          圖像的異步加載

          圖像的加載和顯示是異步進行的,圖像 的生產者(ImageProducer)傳遞給圖像的消費者(ImageConsumer)一個與圖像相關的位,因為圖像的生產過程是一個異步行為,所以 AWT 也提供一個圖像觀察(ImageObserver),用來監視圖像生產者的圖像生產過程。

          因為 java.awt.Component 實現 ImageObserver 接口,所以 AWT 中每個構件都是ImageObserver ,當一個給定的 ImageProducer 采取異步操作時,這個 ImageObserver 可以選擇是否被更新。

          現在看一個例子:

          import?java.net.URL;
          import?java.applet.Applet;
          import?java.awt.Graphics;
          import?java.awt.Image;

          public?class?ImageTestAppletSimple2
          ????
          extends?Applet?{
          ??
          private?Image?im;

          ??
          public?void?init()?{
          ????im?
          =?getImage(getCodeBase(),?"lena.jpg");
          ??}

          ??
          public?void?paint(Graphics?g)?{
          ????System.out.println(
          "drawing?image");
          ????System.out.println(g.drawImage(im,?
          0,?0,?this));
          ??}
          }

          當這個 Applet 第一次被調用時,將打印出下面的結果:
          drawing?image...
          false
          drawing?image...
          false
          drawing?image...
          false
          drawing?image...
          true

          執 行結果說明 drawImage() 在第一次被調用時,沒有圖像被加載,drawImage() 只是向和圖像相關的 ImageProducer 注冊 ImageObserver,圖像被完全加載前 drawImage() 方法返回 false 直到圖像被完全加載返回 true。

          當 drawImage() 返回之后,只要有圖像的新的部分被加載,ImageObserver 中的 imageUpdate() 方法就會被調用。當 ImageObserver 是 AWT 構件時,Component.imageUpdate() 調用 repaint() 方法清除構件背景并調用 paint() 方法重繪剛剛得到的圖像位。重復循環,ImageProducer 加載圖像的下一塊,調用 ImageObserver 的 imageUpdate()。當圖像被完全加載時,ImageProducer 停止調用 ImageObserver 的 imageUpdate(),循環中斷。

          load -> imageUpdate() -> repaint() -> update() -> paint()


          等待圖像的完全加載

          上面的例子介紹了圖像的異步加載,現在介紹2個方法使圖像完全加載前不顯示。

          ·重載 ImageObserver 中的 imageUpdate() 方法,使其在圖像完全加載前不調用 repaint()。


          import ?java.applet.Applet;
          import ?java.awt.Graphics;
          import ?java.awt.Image;

          public ? class ?ImageTestAppletWithUpdate
          ????
          extends ?Applet?{
          ??
          private ?Image?im;

          ??
          public ? void ?init()?{
          ????im?
          = ?getImage(getCodeBase(),? " lena.jpg " );
          ??}

          ??
          public ? void ?paint(Graphics?g)?{
          ????g.drawImage(im,?
          0 ,? 0 ,? this );
          ??}

          ??
          public ? boolean ?imageUpdate(Image?image,? int ?flags,? int ?x,? int ?y,? int ?w,? int ?h)?{
          ????System.out.println(
          " imageUpdate():x= " ? + ?x? + ? " ,y= " ? + ?y? + ? " ,w= " ? + ?w? + ? " ,h= " ? +
          ???????????????????????h);

          ????
          if ?(?(flags? & ?ALLBITS)? == ? 0 )?{
          ??????
          return ? true ;? // ?need?more?updates
          ????}
          ????
          else ?{
          ??????repaint();
          ??????
          return ? false ;? // ?image?is?fully?loaded
          ????}
          ??}
          }

          使用 java.awt.MediaTracker 類跟蹤圖像的加載,不必重載 imageUpdate() 方法。


          import ?java.net.URL;
          import ?java.applet.Applet;
          import ?java.awt.Graphics;
          import ?java.awt.Image;
          import ?java.awt.MediaTracker;

          public ? class ?ImageTestAppletWithMediaTracker
          ????
          extends ?Applet?{
          ??
          private ?Image?im;

          ??
          public ? void ?init()?{
          ????im?
          = ?getImage(getCodeBase(),? " lena.jpg " );

          ????MediaTracker?tracker?
          = ? new ?MediaTracker( this );
          ????tracker.addImage(im,?
          0 );
          ????
          try ?{
          ??????tracker.waitForID(
          0 );
          ????}
          ????
          catch ?(InterruptedException?e)?{
          ??????e.printStackTrace();
          ????}

          ????System.out.print(
          " Image?width?=? " ? + ?im.getWidth( this ));
          ????System.out.println(
          " height?=? " ? + ?im.getHeight( this ));
          ??}

          ??
          public ? void ?paint(Graphics?g)?{
          ????g.drawImage(im,?
          0 ,? 0 ,? this );
          ??}
          }

          我們可以把使用 java.awt.MediaTracker 類將圖像完全加載的方法包裝成一個實用方法

          /** ? *//**
          ???*?使用?java.awt.MediaTracker?將圖像完全加載。
          ???*?
          @param ?component?Component
          ???*?
          @param ?img?Image
          ???
          */
          ??
          public ? static ? void ?waitForImage(Component?component,?Image?img)?{
          ????MediaTracker?tracker?
          = ? new ?MediaTracker(component);
          ????
          try ?{
          ??????tracker.addImage(img,?
          0 );
          ??????tracker.waitForID(
          0 );
          ????}
          ????
          catch ?(InterruptedException?ex)?{
          ??????ex.printStackTrace();
          ????}
          ??}

          posted on 2005-07-12 10:33 leon 閱讀(1388) 評論(0)  編輯  收藏 所屬分類: JFC

          導航

          統計

          公告

          DSC_0106.jpg
          本博客已經搬家到CSDN
          http://blog.csdn.net/chenweionline




          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          About Technology

          My Favorite Website

          搜索

          積分與排名

          最新評論

          • 1.?re: 胃痙攣
          • 兄弟們你們都做胃鏡了嗎開的啥藥?有什么養胃秘方啊?請賜教啊!
          • --我也進來了
          • 2.?re: 胃痙攣
          • @痛啊
            我感覺比生孩子還疼,生孩子還能有意識呢!這種疼還叫不出來連說話的力氣都沒了
          • --我也進來了
          • 3.?re: 胃痙攣
          • 評論內容較長,點擊標題查看
          • --我也進來了
          • 4.?re: 胃痙攣
          • 我都周期性的發作,算來有4年了 。每年最少一次,一次最少2天。吃了好多藥就差沒去做胃鏡了。 剛剛發作就隨便煮了點姜湯喝下就好了些,不知道還會不會發作了。
          • --許家洛
          • 5.?re: 胃痙攣
          • 我昨晚也疼的要死。。上次疼的直接120送醫院了,一上120我竟然就不疼了,醫院里掉了瓶鹽水就放回家了。這次正好國外旅游中,幾乎疼了一整晚,整個在床上翻滾狀態了。今天不疼了,就是整個人難受。。。求助阿
          • --胃疼
          • 6.?re: [Swing]在 JFileChooser 中進行文件驗證的小技巧
          • 輸入*還是會有問題
          • --ngh
          • 7.?re: 胃痙攣[未登錄]
          • 昨晚一夜的身不如死的感覺,胃痙攣兄不要來了吧 ,求你了
          • --李飛
          • 8.?re: 胃痙攣
          • 評論內容較長,點擊標題查看
          • --daidai
          • 9.?re: 胃痙攣
          • 評論內容較長,點擊標題查看
          • --痛啊
          • 10.?re: 胃痙攣
          • 媽啊 痛的快死了~!第一次感覺過這樣的痛啊~!和女的生孩子有的一比了吧~!哭哭哭~!
          • --痛啊

          閱讀排行榜

          主站蜘蛛池模板: 和龙市| 屯留县| 抚州市| 滨州市| 根河市| 乐陵市| 云梦县| 临颍县| 揭阳市| 大荔县| 沾益县| 定南县| 拜泉县| 滦南县| 定兴县| 秭归县| 正蓝旗| 松潘县| 文登市| 共和县| 鄢陵县| 霍城县| 和龙市| 旺苍县| 甘谷县| 正定县| 苏尼特右旗| 常州市| 荆门市| 湖南省| 江西省| 柯坪县| 旬阳县| 安多县| 息烽县| 香格里拉县| 喀什市| 古蔺县| 萝北县| 文水县| 萨嘎县|