2012-08-07 71 views
3

我们忽略这样为什么调用“repaint()”而不是直接调用Applet中的“paint(..)”?

public void paint(Graphics g) 
{ 
    g.drawString(msg,xpos,ypos); 
} 

paint方法如果我们有另一种方法可以说,到mousePressed事件方法

public void mousePressed(MouseEvent me)  
    { 
     xpos=me.getX(); // msg, xpos and ypos are variables of class 
     ypos= me.getY(); 
     msg="You pressed mouse"; 
     repaint(); 
    } 

为什么不能我们调用paint (Graphics g)而非repaint()

+0

简短回答:因为那样会在错误的时间或可能在错误的线程中调用(并且没有适当的图形)。 – 2012-08-07 02:57:03

+0

当我们平常覆盖它时,我们只给出图形类的实例,没有其他的东西,为什么不合适的图形?0 – Nil 2012-08-07 02:58:31

+3

Graphics对象必须由JVM本身在平台/操作系统的帮助下准备和交付。你不能只是试着当场做一个。 – 2012-08-07 03:04:57

回答

13

你应该尝试一下。您会注意到

  1. 您必须以某种方式获得Graphics对象g
  2. 在事件处理程序的主体中调用paint不是一种最佳做法,因为它会使该方法的主体立即在GUI线程上执行,因此只有在paint返回时才能处理更多事件。 OTOH,repaint将在未来某个方便的时刻安排绘画事件,并且不会使GUI看起来挂起。当然,你的情况,drawString是不是非常慢,但在一般....

Here is the classic article on painting,从Java人本身。

+2

+1为绘画作品 – MadProgrammer 2012-08-07 03:02:58

+0

什么是OTOH? thx文章 – Ungeheuer 2015-05-20 19:44:31

+0

[“另一方面”](http://en.wiktionary.org/wiki/OTOH) – 2015-05-21 04:48:05

9

调用repaint()不一定会立即导致调用paint()。它要求安排一个呼叫。

您通常应该调用repaint而不是绘画,以便GUI框架可以正确调度重新绘制。它会做一些事情,比如确保paint在正确的线程中被调用,并且有机会合并多个调用来重新绘制,如果它们在框架开始实际绘制之前发生的话。

调用repaint将会更加健壮。

+1

提及调度程序的+1 - 另外,因为您会绕过调度程序,所以最终可能会导致造成可怕的表现,因为重绘经理正在建立一个需要更新的想法,而不是每次更新整个屏幕;) – MadProgrammer 2012-08-07 03:02:25

相关问题