新トップページへ | Tip

JavaAppletの基本的なメモ

LastUpdate : 07/01/19

 JavaAppletについてのメモ書きです(JDK1.6.0)。
まぁ、ちょっとやってみただけなので、これしかありません^^;

 イメージ・文字・図形の描画にはGraphicsクラス( http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/Graphics.html )、Fontクラス( http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/Font.html )などが主役です。  

☆ もくじ。
  1. フォントを使用しテキストの描画とベースライン
  2. イメージを描画する
  3. バックバッファの作り方(描画の際のダブルバッファリング)

フォントを使用しテキストの描画とベースライン

☆ フォントを使用しテキストの描画と文字の範囲のラインを描画する。

import java.applet.Applet;
import java.awt.*;

/*
        <applet code="TestMain" width=640 height=480>
        </applet>
*/

public class TestMain extends Applet
{
        public void init()
        {
        }
        
        public void start()
        {
        }
        
        public void stop()
        {
        }
        
        public void destroy()
        {
        }
        
        public void paint(Graphics g)
        {
                //画面サイズを取得する。
                Dimension Area = getSize();
                int base_line = Area.height/2;
                
                //オレンジ色のベースラインを引く。
                g.setColor(Color.ORANGE);
                g.drawLine( 0,base_line,Area.width,base_line );
                
                //フォントの作成。
                Font Fnt = new Font("MS Pゴシック",Font.PLAIN,64);
                //文字の属性の情報表示。
                FontMetrics Metrics = g.getFontMetrics(Fnt);
                int ascent = Metrics.getAscent();
                int descent = Metrics.getDescent();
                int leading = Metrics.getLeading();
                //アセントを青色ラインで描画
                g.setColor(Color.BLUE);
                g.drawLine( 0,base_line-ascent,Area.width,base_line-ascent );
                //ディセンとを濃いグレイ色ラインで描画
                g.setColor(Color.DARK_GRAY);
                g.drawLine( 0,base_line+descent,Area.width,base_line+descent );
                //リーディングをピンク色ラインで描画
                g.setColor(Color.PINK);
                g.drawLine( 0,base_line+descent+leading
                                ,Area.width,base_line+descent+leading);
                
                //自分が指定したい色で、文字色を設定する。
                Color Clr = new Color(0xff,0xee,0xee);
                g.setColor(Clr);
                //フォントを設定して文字列の描画。
                g.setFont(Fnt);
                g.drawString("ABCabcy@{#\"]|'_",10,base_line);          
        }
}

イメージを描画する

 イメージのダウンロードが完了するのを待つにはMediaTrackerというクラスを使うらしい( http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/MediaTracker.html )。getImageメソッドはイメージがロード完了したしないにかかわらず、すぐに制御を返すみたいです。
 また、pngファイルを例では読み込ませていますが、描画を行なう際、アルファチャンネルもちゃんと反映されている様子です(32Bitフォーマット)。

☆ イメージのロードを待ってから、イメージを描画する。

import java.applet.Applet;
import java.awt.*;

/*
        <applet code="TestMain" width=640 height=480>
        &lt/applet>
*/

public class TestMain extends Applet
{
        Image m_Img;
        MediaTracker m_Tracker; 
        
        public void init()
        {
                m_Tracker = new MediaTracker(this);
                //javaファイルがある同じフォルダの中のimage1.pngを読み込む。
                m_Img = getImage(getDocumentBase(),"image1.png");
                m_Tracker.addImage(m_Img,0);    //第二引数の0は識別用の値。
                try
                {
                        //指定したイメージがロードされるまで待つ。
                        m_Tracker.waitForID(0); //addImageの第二引数と同じ値にする。
                }
                catch( InterruptedException E )
                {
                        return;
                }
        }
        
        public void start()
        {
        }
        
        public void stop()
        {
        }
        
        public void destroy()
        {
        }
        
        public void paint(Graphics g)
        {
                this.setBackground(Color.LIGHT_GRAY);
                if( (m_Tracker.statusAll(false) & MediaTracker.ERRORED) == 0 )
                {
                        g.drawImage( m_Img,0,0,this );
                }
        }
}

バックバッファの作り方(描画の際のダブルバッファリング)

 「グラフィックコンテキスト」を使用することでイメージのバッファに対し、描画が行なえます。それを利用し、バッファにすべて書き込んでから、フロントバッファ(画面)に描画を行ない、ちらつきを抑えます。
 サンプルでは、イメージを読み込み、右下斜めにイメージを移動させています(手抜き処理)。

☆ 裏画面を使いイメージの描画。

import java.applet.Applet;
import java.awt.*;

/*
        <applet code="TestMain" width=640 height=480>
        &lt/applet>

*/

public class TestMain extends Applet implements Runnable
{
        Dimension m_Dimension;
        Image m_BackBuffer;
        Graphics m_BackBufferGraphics;
        Image m_Img;
        MediaTracker m_Tracker;
        int m_x,m_y;
        boolean m_setup_ok_flag;
        
        public void run()
        {
                //アプレット起動の準備をする。
                if( appletSetup() != 0 )
                {
                        return;
                }
                m_setup_ok_flag = true;
                
                //描画ループへ。
                while( true )
                {
                        repaint();
                        try{    Thread.sleep(16);       }
                        catch( InterruptedException E )
                        {
                                return;
                        }
                }
        }
        
        public void init()
        {
                Thread Trd = new Thread(this);
                Trd.start();
        }
        
        public void start()
        {
        }
        
        public void stop()
        {
        }
        
        public void destroy()
        {
        }
        
        public void update(Graphics g)
        {
                //updateメソッドをオーバーライドすることで
                //デフォルトの処理で行なわれる、画面の消去
                //をキャンセルさせる。
                paint(g);
        }
        
        public void paint(Graphics g)
        {
                drawTest(g);
        }
        
        
        protected int appletSetup()
        {
                //裏画面の作成。
                m_Dimension = getSize();
                m_BackBuffer = createImage( m_Dimension.width,m_Dimension.height );
                //裏画面のグラフィックコンテキストを取得する。
                m_BackBufferGraphics = m_BackBuffer.getGraphics();
                
                //javaファイルがある同じフォルダの中のimage1.pngを読み込む。
                m_Tracker = new MediaTracker(this);
                m_Img = getImage(getDocumentBase(),"image1.png");
                m_Tracker.addImage(m_Img,0);    //第二引数の0は識別用の値。
                try
                {
                        //指定したイメージがロードされるまで待つ。
                        m_Tracker.waitForID(0); //addImageの第二引数と同じ値にする。
                }
                catch( InterruptedException E ) {       return -1;      }
                
                return 0;
        }
        
        protected int drawTest(Graphics g)
        {
                if( !m_setup_ok_flag )return 0;
                
                //バックバッファのグラフィックコンテキストを通して、
                //バックバッファに描画を行なう。
                
                //バックバッファの内容のクリア。
                m_BackBufferGraphics.setColor(Color.LIGHT_GRAY);
                m_BackBufferGraphics.fillRect(0,0,m_Dimension.width,m_Dimension.height);
                //イメージの描画
                if( (m_Tracker.statusAll(false) & MediaTracker.ERRORED) == 0 )
                        m_BackBufferGraphics.drawImage( m_Img,m_x,m_y,this );
                
                //バックバッファを画面に表示する。
                g.drawImage(m_BackBuffer,0,0,this);
                
                //座標の更新(手抜きw)。
                if( m_x++ > 100 )m_x=0;
                if( m_y++ > 100 )m_y=0;
                
                return 0;
        }
}