在您致電repaint()
之後,它不會立即重新繪製組件。但它添加了在EDT中的事件隊列中再次繪製組件的請求。
在每行代碼會發生什麼情況如下expained ..
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
馬克由方(squareX,squareY,squareW+OFFSET,squareH+OFFSET)
圍成的區域將是重新繪製。但它沒有得到重新繪製,直到RepaintManager
這樣做..
squareX=x;
squareY=y;
變化squareX
和squareY
值。但它不會改變早先標記的區域進行重新粉刷。現在,要重新繪製的區域也是先前的值。
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
標記由方塊(squareX,squareY,squareW+OFFSET,squareH+OFFSET)
包圍的區域將被重新繪製。現在有兩個部分RepaintManager
必須重新繪製。上一個廣場和新廣場。但它不會被重新粉刷,直到RepaintManager
這樣做。
最後當時間到了,RepaintManager
繪製組件。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("This is my custom Panel!",10,20);
g.setColor(Color.RED);
g.fillRect(squareX,squareY,squareW,squareH);
g.setColor(Color.BLACK);
g.drawRect(squareX,squareY,squareW,squareH);
}
現在組件只繪製2個區域。 (以前的廣場和新的廣場)但是紅色的廣場只會在新的廣場內畫出。在老廣場上沒有什麼可以畫的。所以先前繪製的東西將被刪除..
其實雖然有2個方法調用repaint()
,paintComponents()
將只被調用一次。要重新繪製的總面積由RepaintManager
和paintComponents()
處理僅處理一次..
請正確縮進此。否則,我無法真正閱讀它。 –
'repaint'不會立即發生,它們被髮布到事件隊列中並在將來的某個時刻處理,因爲'moveSquare'方法在EDT中執行,您可以保證重繪不會直到'moveSquare'方法退出之後纔會發生 – MadProgrammer