最初は…
…なあんて考えていて、 古い学生のプログラムを見ていたら、 とっくに解決済みだった。
三井康之君の波動方程式のプログラムでは
public class 名前 extends Applet implements Runnable,ActionListener,ItemListener {
Thread th = null;
Graphics bg;
Image buf;
public void init() {
...
buf = createImage(横幅, 縦高);
bg = buf.getGraphics();
...
// 以下 bg に描画する
}
public void start() {
if (th == null) {
th = new Thread(this);
th.start();
}
}
public void run() {
while (running) {
結構重い描画
...
repaint();
}
}
public void stop() {
if (th != null) {
running = false;
th = null;,
}
}
public void paint(Graphics g) {
if (t == 0) {
...
}
g.drawImage(buf, 0, 0, this);
}
}
|
田代航平君の渦糸のプログラムでは
public class クラス名 extends Applet implements Runnable,ActionListener {
private Image off;
private Thread th = null;
// アプレットの最初は init() から
public void init() {
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
g.drawImage(off, 0, 0, this);
}
public void start() {
if (th == null) {
th = new Thread(this);
th.start();
}
}
public void stop() {
if (th != null) {
th = null;
}
}
public void run() {
while (th != null) {
// 計算
}
}
public void actionPerformed(ActionEvent ev) {
if (e.getSource() == bt[0]) {
...
start();
}
else if (e.getSource() == bt[1]) {
...
stop();
}
}
}
|
はてな? AWT のコンポーネントでは、 再描画の要求があると、 repaint(), update(), paint() の順に 描画メソッドが呼び出されていく。 何か描き足すときは paint() に… と物の本に書いてあった。 田代君の paint() から update() を 呼び出すのは無駄では? …いや、オーバーライドしているので、 無駄は生じていない。 しかし通常とは逆の呼び出し順になっていて気持ちが悪い。 筆者としては
public void paint(Graphics g) {
g.drawImage(off, 0, 0, this);
}
public void update(Graphics g) {
paint(g);
}
|