最初は…
…なあんて考えていて、 古い学生のプログラムを見ていたら、 とっくに解決済みだった。
三井康之君の波動方程式のプログラムでは
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); } |