-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()

paint()如果 Swing 检测到需要重绘小程序,则该方法由 Swing 在 GUI 事件处理线程中独立调用。

我注意到该类的 mainrun()方法也反复调用repaint(). 这明确告诉 GUI 线程调用update().

于 2008-12-22T09:12:01.173 回答
3

浏览器或 Applet 查看器首先调用

  • init() 方法通知这个小程序它已被加载到系统中。
  • 然后在调用 init start() 方法之后。有关更多信息,请参阅 Applet 类文档。
  • 在 start() 方法中调用了 th.start()。这意味着 start() 线程执行
  • 这将导致 run() 被调用
于 2008-12-22T09:11:23.607 回答
3

The Java Tutorials的 Applet 生命周期部分,按顺序调用 的以下方法:Applet

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

另外,代码实现了Runnable接口,所以BallApplet'run()方法也是在调用方法运行一个新的Thread(这里是被调用的)之后执行的。(调用该方法会启动一个新线程并调用其方法。)thth.start()Thread.start()run()

The Java Tutorials 中的定义和启动线程Runnable部分提供了有关在 Java 中启动线程以及Thread如何启动线程的更多信息。

run()方法包含对 的调用repaint(),这是一个应用程序触发的更新,它将调用BallApplet'update(Graphics g)方法。此外,系统触发的重绘会触发该paint(Graphics g)方法。

有关在 AWT 中重新绘制的更多信息,请参阅在 AWT 和 Swing 中绘制。有关系统和应用程序触发的绘画的信息,请参阅系统触发与应用程序触发的绘画部分。

于 2008-12-22T09:23:44.613 回答
0

请参阅Thread.start()

public void start()

使该线程开始执行;Java 虚拟机调用run 该线程的方法。

结果是两个线程同时运行:当前线程(从对 start 方法的调用返回)和另一个线程(执行其 run 方法)。

多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

于 2008-12-22T09:21:49.717 回答