アニメーションの速度を調整する
この「imageUpdateで次のフレームの呼び出しを行うかどうかが調整できる」ということがわかると、これを利用した応用もいろいろ考えられるようになるでしょう。例えば、「アニメーションの速度を調整する」ということも可能になりますね。これは、要するにimageUpdateで少しだけsleepしてからreturnすればいいわけです。
import java.awt.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;
public class Sample extends Frame {
private Image img = null;
private boolean anim = true;
private int wait = 100;
public static void main(String[] args){
int n;
try {
n = Integer.parseInt(args[0]);
} catch (RuntimeException ex) {
n = 100;
ex.printStackTrace();
}
new Sample(n).setVisible(true);
}
public Sample(int n){
wait = n;
setSize(300,200);
img = Toolkit.getDefaultToolkit().createImage("anim.gif");
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent ev){
anim = !anim;
repaint();
}
});
}
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
g.drawImage(img,50,50,this);
}
public boolean imageUpdate(Image im,int flag,int x,int y,int w,int h){
super.imageUpdate(im,flag,x,y,w,h);
if ((flag & ImageObserver.FRAMEBITS) != 0){
try {
Thread.sleep(wait);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
return anim;
}
return true;
}
}
ここでは、Sampleを起動する際、「java Sample 100」というように再描画の間隔を示す値(ミリ秒)を引数に指定することで、アニメーションの速度を設定できるようにしてあります。imageUpdateを見るとわかりますが、(flag & ImageObserver.FRAMEBITS) != 0であった場合、Thread.sleepでスレッドを一時的に停止しています。これで次のフレーム更新までの間隔を調整しているわけです。
【Javadocリファレンス】
java.awt.image.ImageObserverクラス
java.awt.Graphicsクラス