Java: В каком порядке методы вызываются в апплете? - PullRequest
0 голосов
/ 22 декабря 2008

Из всех этих методов что запускается и в каком порядке ?? Я думаю, первый вопрос, который нужно задать, это что запускается первым?

И почему 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 ]

4 голосов
/ 22 декабря 2008

Сначала вызываются методы init() и start().

Это, в свою очередь, создает Thread и запускает этот поток, что вызывает метод run() этого класса.

Метод paint() вызывается Swing независимо в потоке обработки событий GUI, если Swing обнаруживает, что апплет должен быть перерисован.

Замечу, что основной метод run() класса также неоднократно вызывает repaint(). Это явно указывает потоку GUI на вызов update().

3 голосов
/ 22 декабря 2008

Из жизненного цикла апплета раздела Учебники Java , следующие методы Applet вызываются по порядку:

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

Кроме того, в коде реализован интерфейс Runnable, поэтому метод BallApplet *1025* также выполняется после того, как новый Thread (здесь он называется th) запустить, вызвав метод th.start(). (Вызов метода Thread.start() запускает новый поток и вызывает его метод run().)

Раздел Определение и запуск потока из Учебников Java содержит дополнительную информацию о Runnable и Thread и о том, как потоки запускаются в Java.

Метод run() содержит вызов repaint(), и это обновление, запускаемое приложением, вызовет метод BallApplet update(Graphics g). Кроме того, системная перерисовка запускает метод paint(Graphics g).

Для получения дополнительной информации о перерисовке в AWT см. Рисование в AWT и Swing . Информацию о рисовании, инициируемом системой и приложением, см. В разделе Живопись, инициируемая системой и рисованием, запускаемым приложением .

3 голосов
/ 22 декабря 2008

Браузер или программа просмотра апплетов сначала вызывает

  • init () метод, чтобы сообщить этому апплету, что он был загружен в систему.
  • затем после инициализации init () вызывается метод. Для получения дополнительной информации см. Документы класса Applet.
  • Внутри метода start () есть вызов th.start (). Это означает start () выполнение потока
  • Это приведет к запуску run ()
0 голосов
/ 22 декабря 2008

См. Thread.start () .

public void start()

Заставляет этот поток начать выполнение; виртуальная машина Java вызывает run метод этой темы.

В результате два потока работает одновременно: текущий поток (который возвращает вызов метод запуска) и другой поток (который выполняет метод run).

Нельзя начинать тему больше чем единожды. В частности, поток не может быть перезапущен, как только он завершил выполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...