一个很简单的例子:
{
     System.out.println("draw 前...");
     repaint();
     System.out.println("draw 后...");
}
然后重写paint方法在paint方法中加入一句话
{
    super.paint(g);
    System.out.print("drawing...");
}然后点击按钮控制台出现
draw 前...
draw 后...
drawing...证明repaint肯定是延时了.
1.它如何延时的?
2.如何才能让程序正确的走这个流程呢?

解决方案 »

  1.   

    调用repaint()并不立即重绘,只是把重绘请求放进一个工作队列。
      

  2.   

    repaint操作是swing内部操作,标准Java Swing的动作都在EDT线程上运行,不会立即执行。
      

  3.   

    要知道 repaint() 后面其实调用了两个方法 先update() --->后 paint()
    而且估计这又是一个线程再执行吧!
    在你的

        System.out.println("draw 前..."); 
        repaint(); 
        Thread.sleep(50); 
        System.out.println("draw 后..."); 

      

  4.   

    加flag,paint()设置标志,其他执行语句放到线程,读flag,flag变了就执行
    勉强可以实现,不过估计程序也要变得乱七八糟的
      

  5.   

    当用户调用repaint方法后,实际上,系统后台调用了paint方法,所以,你的问题,要画一条直线,或者清除一条直线,那么你的绘制代码或清除代码要写到paint方法中,然后需要绘制或清除的时候,调用repaint方法,就可以了
      

  6.   


    System.out.println("before drawing...");
    self.repaint();
    SwingUtilities.invokeLater(new Runnable() { @Override
    public void run() {
    // TODO Auto-generated method stub
    System.out.println("after drawing...");
    }

    });这样也许可以,虽然也许需要线程,但是消除了flag
    你试一下
      

  7.   


    这样确实可以,能否解释一下?为什么?看了JDK但解释还是不太清楚.
      

  8.   

    我也不是很清楚,下面是推测
    paint()是被放到事件派发线程里,用invokeLater貌似也是放到事件派发线程里的,
    这样的话是不是就可以保证顺序的执行?很可能解释的不对,最好能有高人来解释下
      

  9.   

    大家都说出了paint()不会立即执行,有没有方法让他马上执行的?
      

  10.   

    搂主,如果你有时间和精力的话就看看jdk的源代码吧,虽然比较复杂,但是那里有最直接的答案