我期待这个小程序写x = 0和x = 10,但它没有:
import java.applet.*;
import java.awt.*;
/*
<applet code="deney1" width=300 height=100>
</applet>
*/
public class deney1 extends Applet {
int x=0; // current position
public void paint(Graphics g) {
g.drawString("x="+x, 0,20);
x+=10;
g.drawString("x="+x, 0,40);
x+=1;
}
}
这里发生了什么?
编辑:建议我的问题可能与此问题重复:
how is paint() running without being called in the main method?
这篇文章告诉我paint()方法将在没有显式调用的情况下运行。但这并不能解释paint()中语句的执行顺序,而且我无法跟踪打印的x值。为什么不是0和10?为什么不是11和22? 为了使事情更清楚:
g.drawString("x="+x, 0,20); // 1
x+=10; // 2
g.drawString("x="+x, 0,40); // 3
x+=1; // 4
似乎:2和4在1之前执行(x变为11)。然后在3之前只执行2(x变为21)。
问题1:为什么2和4在1之前执行?
问题2:考虑到问题1的答案,为什么4还没有在3之前第二次执行?
答案 0 :(得分:0)
这个问题非常受欢迎:
why is my code executing paintComponent(Graphics page) twice?
Why does the paint method run twice?
paint() in java applet is called twice for no reason
http://www.java-forums.org/awt-swing/58131-help-yet-another-paint-called-twice-thread.html
在第一次运行时,它打印x = 0 x = 10,正如我预期的那样。 (x在第一次运行结束时变为11)。 然后paint()方法再次运行(这次以x值11开始)并打印x = 11 x = 21,这是applet窗口的最终视图。
证明:您可以添加一些代码,在x + = 1后暂停程序几秒钟,当您运行程序时,首先您会看到x = 0 x = 10 ,然后它将变为x = 11 x = 21。
带回家的内容:写下你的paint()方法,好像它会运行x次(你事先不能知道x)。所以不要在里面进行计算。