【问题标题】:Why call "repaint()" instead of directly calling "paint(..)" in an Applet?为什么在 Applet 中调用“repaint()”而不是直接调用“paint(..)”?
【发布时间】:2012-08-04 00:48:03
【问题描述】:

我们像这样重写paint方法

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

如果我们有其他方法,可以说是鼠标按下事件方法

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
  • Graphics 对象必须由 JVM 自己在平台/操作系统的帮助下准备和交付。您不能只是尝试当场弥补。

标签: java swing applet awt repaint


【解决方案1】:

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

  1. 您必须以某种方式获取Graphics 对象g
  2. 在事件处理程序的主体中调用paint 不是最佳实践,因为它会导致该方法的主体立即在GUI 线程上执行,因此在paint 返回之前无法处理更多事件。 OTOH,repaint 安排绘制事件在将来某个方便的时间点发生,并且不会使 GUI 看起来挂起。当然,在您的情况下,drawString 并不是很慢,但总的来说......

Here is the classic article on painting,来自 Java 人自己。

【讨论】:

    【解决方案2】:

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

    您通常应该调用重绘而不是绘制,以便 GUI 框架可以正确安排重绘。它会做一些事情,比如确保在正确的线程上调用绘制,并且如果它们发生在框架开始进行实际绘制之前,它有机会合并多个重绘调用。

    调用 repaint 会更加健壮。

    【讨论】:

    • +1 用于提及调度程序 - 此外,由于您会绕过调度程序,您可能会以糟糕的表现告终,因为重绘管理器正在构建需要更新的概念,而不是每次都更新整个屏幕;)
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2010-12-13
    • 2022-12-17
    • 2013-07-09
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多