next up previous contents
Next: B. MPEGビデオ作成計画 (メモ) Up: A. 熱方程式プログラム (いつまでも工事中) Previous: A..4.1 NewHeat1Dv4.java

A..5 考えていること

最初は…

…なあんて考えていて、 古い学生のプログラムを見ていたら、 とっくに解決済みだった。

三井康之君の波動方程式のプログラムでは
  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);
  }
と書きたい。 通常 update() で行なわれるという、 クリアする処理が省けている (狙いは田代君も同じだろうけれど)。


next up previous contents
Next: B. MPEGビデオ作成計画 (メモ) Up: A. 熱方程式プログラム (いつまでも工事中) Previous: A..4.1 NewHeat1Dv4.java
Masashi Katsurada
平成20年2月28日