<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Do you drink java?



          像寫情書一樣coding

     

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

    圖像的異步加載

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

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

    現(xiàn)在看一個例子:

    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));
    ??}
    }

    當(dāng)這個 Applet 第一次被調(diào)用時,將打印出下面的結(jié)果:
    drawing?image...
    false
    drawing?image...
    false
    drawing?image...
    false
    drawing?image...
    true

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

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

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


    等待圖像的完全加載

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

    ·重載 ImageObserver 中的 imageUpdate() 方法,使其在圖像完全加載前不調(diào)用 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 閱讀(1386) 評論(0)  編輯  收藏 所屬分類: JFC

    導(dǎo)航

    統(tǒng)計

    公告

    DSC_0106.jpg
    本博客已經(jīng)搬家到CSDN
    http://blog.csdn.net/chenweionline




    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    About Technology

    My Favorite Website

    搜索

    積分與排名

    最新評論

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

    閱讀排行榜

    主站蜘蛛池模板: 亚洲视频在线观看免费| 亚洲乱码一区二区三区在线观看 | 午夜视频在线观看免费完整版| 亚洲精品自产拍在线观看动漫| 久久久久久久99精品免费观看| 中文字幕亚洲不卡在线亚瑟| 成年免费a级毛片| 国产AV无码专区亚洲AWWW| 国产精品成人免费观看| 国产av无码专区亚洲av果冻传媒 | 美女羞羞视频免费网站| 啊v在线免费观看| 一个人免费观看日本www视频 | 日韩免费无砖专区2020狼| 黄色网页免费观看| 国产亚洲成人久久| 久久免费区一区二区三波多野| 亚洲黄网站wwwwww| 妞干网免费观看视频| 日韩精品无码免费视频| 亚洲精品字幕在线观看| 131美女爱做免费毛片| 亚洲第一男人天堂| 亚洲国产香蕉人人爽成AV片久久 | 亚洲天堂免费在线| 无码一区二区三区亚洲人妻| 国产精品亚洲高清一区二区| 黄页免费在线观看| 中文无码亚洲精品字幕| 久久影视国产亚洲| 在线美女免费观看网站h| 亚洲av永久中文无码精品综合 | 伊人久久大香线蕉亚洲五月天| 麻豆成人久久精品二区三区免费| 亚洲www77777| 中文字幕一精品亚洲无线一区| 青青草a免费线观a| 国产福利免费视频| 亚洲理论在线观看| 亚洲国产人成精品| 日韩欧毛片免费视频|