画像の表示

  1. 目的

    アプレットで画像ファイルを読み込み、表示します。

  2. 利用法

    1. 画像ファイル
      画像ファイルとしては、 .jpg 型ファイルを利用します。このファイルは写真用として広く利用されている圧縮形式の画像ファイルです。他に、.gif型のファイルも利用できます。

    2. 利用法
       Image クラスを利用します。この実体(中身)は、次の getImage() で作成しますから、 new() を行う必要はありません。

       Image Image=null;

      getImage()で shoubu.jpg ファイルを読みます。画像ファイルは、このアプレットと同じフォルダに置いてあるものとします。

       Image= getImage(getCodeBase(), "shoubu.jpg");

      画像を表示するには、g.drawImage();を利用します。これは、paint() のなかで呼び出します。20,20 は表示する左上の位置です。

       g.drawImage(Image, 20, 20, this);

    3. 読み込み完了の待ち合わせ
       大量の画像ファイルを読み出す場合、時間がかかります。 getImage() は、読み込みを開始すると、読み込み完了を待ち合わせることなく、起動するだけで(読み込み完了を待つことなく)終了します。
       読み込み完了を確認するためには、MediaTrackerクラス を利用します。

       MediaTracker mt=new MediaTracker(this);

      画像の読み込みを実行したら、その画像と番号と指定して、mt に addImage() を行います。

       mt.addImage(Image,0);

       ここでは、1枚読むだけですから、0 を指定していますが、2枚目・3枚目の場合、1,2 の番号を指定します。
      読み込みの完了は、この番号を指定して、mt.checkID(0,true) で確認できます。trueが返れば対応する画像の読み込みは完了しています。

       次のプログラムでは、paint() で表示する前に、画像の読み込みを確認をしています。この確認を省略すると、読み込み完了していない画像の処理を始めてしまい、暴走の原因になります。

    4. 参考
       複数の画像を読み込むには、「クラスの配列」を参照して下さい。

    5. 画像ファイル
       画像ファイルを取得するには、ブラウザ(ホームページ)で、保存したいファイルのうえでマウスを右クリックします。メニュが出ますから、「名前をつけて画像を保存」を選択します。ファイル保存ダイアログが出ます。保存するフォルダと名前を指定して、ファイルを保存します。このとき、保存するファイルの型(JPGかGIF)が指定されます。GIF型ファイルの場合 Image= getImage(getCodeBase(), "shoubu.jpg");
      のファイル名を、gif に変更して下さい。

       例 Image= getImage(getCodeBase(), "sample.gif");

  3. プログラム

    1. アプレット
       アプレットでは、Applet クラスを継承します。init() はアプレットを起動するとき最初に呼びだされるクラスで、これを オーバーライド(書き直し)ます。paint() は描画が必要になると呼び出されるメソッドで、これも、オーバーライドです。this.add(button1, null); で、ボタンを配置します。
       

    2. ボタン
       ボタンを利用しています。button1.setLabel("描画");はボタンの名前を指定します。button1.setBounds() はボタンの位置とサイズを指定します。setLayout(null); はボタンを自動配置でなく、位置を指定して配置する指定です。button1.addActionListener() はボタンを押したとき呼び出す関数:button1_actionPerformed(e); を指定します。
      詳細は、こちらをご覧下さい。

    3. 画像を消す
       ここでは、ボタンを押すたびに、交互に画像を表示し、消します。ボタンを押すと rapaint() で、画面を再表示します。このとき、ウインドウを消去してから paint() を呼び出し再描画します。したがって、paint() で何も表示しなければ、画像を消えます。
       そこで、変数 count を用意し、これを0に初期化します。
       ボタンを押す毎に、countに1を加えます。
      paint()で画像を表示するとき、

       (count % 2==1)

      の条件を付けます。count % 2 はcount を2で割った余りです。(count % 2==1) はcountが奇数の時、true(条件が成立)になります。& は 二つの条件が共に成立するとtrueになる 論理積演算 です。

    4. プログラム

      import java.awt.*;
      import java.awt.event.*;
      import java.applet.*;
      
      public class Jpeg extends Applet{
        Image Image=null;
        Button button1 = new Button();
        MediaTracker mt=new MediaTracker(this);
        int count =0;
          
        public void init() {
          
          //画像を読み込む
          Image= getImage(getCodeBase(), "shoubu.jpg");
          //画像読み込みの確認を可能にする
          mt.addImage(Image,0);
          
          //ボタンを用意する
          button1.setLabel("描画");
          button1.setBounds(new Rectangle(40, 136, 70, 23));
          setLayout(null);
          this.add(button1, null);
              
          button1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
            button1_actionPerformed(e);
            }
          });
        }
          
        public void paint (Graphics g)
        {
          //画像を表示する/しない
          if(mt.checkID(0,true) & (count % 2==1)){
            g.drawImage(Image, 20, 20, this);
           }
        }
        
         //ボタンを押したとき  実行される   
        void button1_actionPerformed(ActionEvent e){
          repaint();
          count++;//交互に表示消去するため
        }
      
      }

    5. 実行結果
       描画ボタンを押すと画像が表示されます。もう一度押すと消えます。



    6. アプリで読みとる
       アプレットクラスを継承しないで、アプリとする場合、読み込みには、Toolkitクラスを利用します。

      Toolkit toolkit = Toolkit.getDefaultToolkit();
       image = toolkit.getImage("image/"+gazouFile);

      この場合、次のようにImageIconを利用して、ラベルやボタンに指定したファイルを貼り込むことも可能です。

       icon = new ImageIcon("image/"+gazouFile);//画像表示
       jImageLabel.setIcon(icon);

       どちらも、アプレットでは「自分の(ローカルな)ファイルの読み」になるため、利用できません。アプレットで読めるのは、サーバーに置かれたファイルのみです。