在所有这些方法中,正在运行什么以及以什么顺序运行? 我想要问的第一个问题是先运行什么?
为什么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);
}
}
答案 0 :(得分:4)
首先调用init()
和start()
方法。
反过来创建一个Thread
并启动该线程,这会导致调用此类的run()
方法。
如果Swing检测到需要重绘小程序,则在GUI事件处理线程中由Swing独立调用paint()
方法。
我注意到该类的主run()
方法也反复调用repaint()
。这明确告诉GUI线程调用update()
。
答案 1 :(得分:3)
浏览器或Applet查看器首先调用
答案 2 :(得分:3)
在Life Cycle of an Applet的The Java Tutorials部分,按顺序调用Applet
以下方法:
init()
start()
stop()
destroy()
此外,代码实现了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 一旦线程可能无法重新启动 已完成执行。