java paint()方法如何工作?

时间:2015-04-24 11:01:30

标签: java applet awt

我期待这个小程序写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之前第二次执行?

1 个答案:

答案 0 :(得分:0)

这个问题非常受欢迎:

how does paint() work

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)。所以不要在里面进行计算。