2012-08-07 60 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

相關問題