-1

これらすべてのメソッドのうち、何が実行され、どの順序で実行されますか?? 最初に尋ねる質問は、何が最初に実行されるのかということだと思います。

なぜ th.start() が run() を開始するのでしょうか?

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

import javax.swing.JFrame;

public class BallApplet extends Applet implements Runnable {
    int x_pos = 10;
    int y_pos = 100;
    int radius = 20;

    private Image dbImage;
    private Graphics dbG;

    public void init() {
        // setBackground(Color.BLUE);
    }

    public void start() {
        Thread th = new Thread (this);
        th.start();
    }
    public void stop() {}
    public void destroy() {}

    public void run() {
        // 20 second delay per frame refresh (animation doesn't
        // need to be perfectly continuous)     
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        while (true) {
            x_pos++;
            repaint();
            try {
                Thread.sleep(20);
            }
            catch (InterruptedException ex) {
                System.out.println("Caught!");
            }
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        }
    }
    public void update(Graphics g) {
        // implements double buffering
        // drawing on doublebufferImage, note the dbG=dbImage.getGraphics(), so everything dbG.whatever() is
        //      drawing on the Image's graphics which is later drawn with g.drawImage()

        // initialize buffer
        if (dbImage == null) {
            dbImage = createImage (this.getSize().width, this.getSize().height);
            dbG = dbImage.getGraphics();
        }

        // clear screen in background
        dbG.setColor(getBackground());  // gets background color
        dbG.fillRect(0, 0, this.getSize().width, this.getSize().height);

        // draw elements in background
        dbG.setColor(getForeground());
        paint(dbG);

        // draw image on the screen
        g.drawImage(dbImage, 0, 0, this); 
    }
    public void paint(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(x_pos-radius, y_pos-radius, 2*radius, 2*radius);
    }
}
4

4 に答える 4

4

init()メソッドとメソッドが最初start()に呼び出されます。

これにより、 が作成され、Threadそのスレッドが開始されます。これにより、このクラスのrun()メソッドが呼び出されます。

アプレットを再描画する必要があることを Swing が検出すると、このpaint()メソッドは GUI イベント処理スレッドで Swing によって個別に呼び出されます。

クラスの mainrun()メソッドも を繰り返し呼び出していることに注意してくださいrepaint()。これは、GUI スレッドに明示的に呼び出すように指示しますupdate()

于 2008-12-22T09:12:01.173 に答える
3

Javaチュートリアルのアプレットセクションのライフサイクルから、次のメソッドが順番に呼び出されます。Applet

  1. init()
  2. start()
  3. stop()
  4. destroy()

さらに、コードはRunnableインターフェースを実装しているため、メソッドを呼び出して新しい(ここではと呼ばれる)が実行された後に、 BallApplet'srun()メソッドも実行されます。(メソッドを呼び出すと、新しいスレッドが開始され、そのメソッドが呼び出されます。)Threadthth.start()Thread.start()run()

Javaチュートリアルの「スレッドの定義と開始Runnable」セクションには、Javaでのスレッドの開始方法とその詳細が記載さThreadれています。

このrun()メソッドにはへの呼び出しが含まれておりrepaint()、これはアプリによってトリガーされる更新であり、BallAppletupdate(Graphics g)メソッドを呼び出します。さらに、システムによってトリガーされる再描画によってpaint(Graphics g)メソッドがトリガーされます。

AWTでの再ペイントの詳細については、「 AWTおよびSwingでのペイント」を参照してください。システムトリガーペインティングとアプリトリガーペインティングの詳細については、システムトリガーペインティングとアプリトリガーペインティングのセクションを参照してください

于 2008-12-22T09:23:44.613 に答える
3

ブラウザまたはアプレット ビューアが最初に呼び出す

  • init() メソッドを使用して、このアプレットがシステムにロードされたことを通知します。
  • 次に、init start() メソッドが呼び出された後。詳細については、Applet クラスのドキュメントを参照してください。
  • start() メソッド内で th.start() への呼び出しがあります。つまり、スレッドの実行を start() します
  • これにより、 run() が呼び出されます
于 2008-12-22T09:11:23.607 に答える
0

Thread.start()を参照してください。

public void start()

このスレッドに実行を開始させます。Java 仮想マシンがrun このスレッドのメソッドを呼び出します。

その結果、2 つのスレッドが同時に実行されます。現在のスレッド (start メソッドの呼び出しから戻るスレッド) と、もう一方のスレッド (その run メソッドを実行するスレッド) です。

スレッドを複数回開始することは決して合法ではありません。特に、実行が完了すると、スレッドは再開されない場合があります。

于 2008-12-22T09:21:49.717 に答える