入力の完了を待って描画する

画像ファイルの入力の完了を待って描画します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして JpegTry.java の名前で保存して下さい。
    //★ 入力の完了を待って描画する    前田 稔
    import java.awt.*;
    import javax.swing.*;
    
    class JpegTry extends JFrame
    {   static  Image   img;
    
        // Main
        public static void main(String args[])
        {   new JpegTry();
        }
    
        // Constructor
        public JpegTry()
        {   super("Win JPEG");
            img = ImageGet("ayu.jpg");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(320, 230);
            setVisible(true);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   super.paint(g);
            if (img!=null)
            {   g.drawImage(img,16,40,this);
            }
        }
    
        // 入力の完了を待って repaint()
        public boolean imageUpdate(Image img, int flg, int x, int y, int w, int h)
        {   if (flg == ALLBITS)     //画像の入力が完了
            {   repaint();
                return false;
            }
            else
            {   return true;  }
        }
    
        // ImageGet メソッド
        public Image ImageGet(String str)
        {   Image   img;
            img = getToolkit().getImage(str);
            return img;
        }
    }
    
  2. JPEG の画像(ayu.jpg)をプログラムと同じフォルダーに格納して下さい。
    テストするときは、適当なサイズの JPEG 画像であれば何でもかまいません。
  3. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Windows の画面に JPEG の画像が表示されたら完成です。

プログラムの説明

  1. 基本的な説明は Image(画像)の描画 を参照して下さい。
  2. getToolkit().getImage() は、スレッドで画像ファイルの入力を開始するとすぐに次へ進みます。
    従って paint() を実行するときには、まだ画像が入力されていません。
    そこで imageUpdate() で画像ファイルの入力の完了を待って描画してみましょう。
    imageUpdate() は画像入力が進展する度に何度も呼ばれます。
    (flg == ALLBITS) で画像の入力が完了したことを確認して repaint() します。
        // 入力の完了を待って repaint()
        public boolean imageUpdate(Image img, int flg, int x, int y, int w, int h)
        {   if (flg == ALLBITS)     //画像の入力が完了
            {   repaint();
                return false;
            }
            else
            {   return true;  }
        }
        
  3. 画像を入力する処理をメソッドにしてみました。
    今は getToolkit().getImage(str) を実行するだけです。
        // ImageGet メソッド
        public Image ImageGet(String str)
        {   Image   img;
            img = getToolkit().getImage(str);
            return img;
        }
        
  4. ImageGet() メソッドで MediaTracker を使って、画像入力の完了を待ち合わせます。
        // ImageGet メソッド
        public Image ImageGet(String str)
        {   Image   img;
            img = getToolkit().getImage(str);
            // MediaTracker で待ち合わせ
            MediaTracker tracker = new MediaTracker(new Component(){});
            tracker.addImage(img, 0);
            try
            {   tracker.waitForID(0);
            } catch(InterruptedException e){}
            return img;
        }
        
  5. MediaTracker を使うと、imageUpdate() は最初に開始したときと、完了したときの二回だけ呼び出されます。
    flg の状態で画像ファイルの入力エラーを調べることが出来ます。
    メソッドが二回呼び出されるので、メッセージも二回表示されます。
    存在しない画像ファイルを設定して、確かめて下さい。
        // 入力の完了を待って repaint()
        public boolean imageUpdate(Image img, int flg, int x, int y, int w, int h)
        {   if (flg == ALLBITS)		//画像の入力が完了
            {   repaint();
                return false;
            }
            else
            {   System.out.println("Image File Error");
                return true;
            }
        }
        

超初心者のプログラム入門(Java2)