Java:Applet中调用的方法的顺序是什么?

时间:2008-12-22 09:04:18

标签: java applet

在所有这些方法中,正在运行什么以及以什么顺序运行? 我想要问的第一个问题是先运行什么?

为什么th.start()会开始运行()?

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 个答案:

答案 0 :(得分:4)

首先调用init()start()方法。

反过来创建一个Thread并启动该线程,这会导致调用此类的run()方法。

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

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

答案 1 :(得分:3)

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

  • init()方法通知此applet已将其加载到系统中。
  • 然后调用init start()方法。有关更多信息,请参阅Applet类文档。
  • 在start()方法中,有一个对th.start()的调用。这意味着start()线程执行
  • 这将导致调用run()

答案 2 :(得分:3)

Life Cycle of an AppletThe Java Tutorials部分,按顺序调用Applet以下方法:

  1. init()
  2. start()
  3. stop()
  4. destroy()
  5. 此外,代码实现了Runnable接口,因此BallApplet的{​​{1}}方法也会在新run()之后执行(此处称为{{1} }})通过调用Thread方法运行。 (调用th方法启动一个新线程并调用其th.start()方法。)

    The Java Tutorials中的Defining and Starting a Thread部分提供了有关Thread.start()run()的更多信息,以及如何在Java中启动线程。

    Runnable方法包含对Thread的调用,这是应用触发的更新,它会调用run()的{​​{1}}方法。此外,系统触发的重绘将触发repaint()方法。

    有关在AWT中重新绘制的更多信息,请参阅Painting in AWT and Swing。有关系统和应用程序触发的绘画的信息,请参阅System-Triggered vs. App-Triggered Painting

    部分

答案 3 :(得分:0)

请参阅Thread.start()

public void start()
  

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

     

结果就是两个线程   并发运行:当前   线程(从调用返回到   start方法)和另一个线程   (执行其run方法)。

     

启动一个线程永远不合法   不止一次。特别是,a   一旦线程可能无法重新启动   已完成执行。