paint,repaint,update,這3個(gè)都跟繪圖有關(guān)系的相關(guān)的方法把。
這3個(gè)雖然以前用過(guò),但是但是沒(méi)有完全理解。
下面這個(gè)段話是轉(zhuǎn)載的(感覺(jué)講的比較好):
repaint()這個(gè)方法是一個(gè)具有刷新頁(yè)面效果的方法,如果你要頁(yè)面進(jìn)行重畫(huà)就可以調(diào)用.
從上面的流程圖可以看出,在繪制動(dòng)畫(huà)圖形時(shí)候如果沒(méi)有調(diào)用repaint()方法的時(shí)候直接就是由線程調(diào)用paint()方法進(jìn)行繪制,用 repaint()進(jìn)行刷新顯示.但是這樣的動(dòng)畫(huà)會(huì)有個(gè)缺點(diǎn)(這樣的效果繪制出來(lái)會(huì)有閃爍).想想做出來(lái)的動(dòng)畫(huà)總是隔一段時(shí)間就閃爍,有人會(huì)看嗎?那么應(yīng) 該怎么去除閃爍呢?我再下面的文章中會(huì)講到.這里主要的是說(shuō)明repaint()這個(gè)方法.
在調(diào)用了repaint()的時(shí)候我門(mén)可以看 出,它并不是直接就去繪制動(dòng)畫(huà)(調(diào)用paint()),而是通過(guò)調(diào)用AWT線程在由線程去調(diào)用另一個(gè)方法update()再由update()調(diào)用畫(huà)筆 paint()方法進(jìn)行繪制. 那么這里為什么要多做一步呢?這樣是不是為我門(mén)多增加代碼的書(shū)寫(xiě)量呢?回答是當(dāng)然不會(huì),如果你不調(diào)用repaint()那么 就不能實(shí)現(xiàn)每一次的刷新顯示,就只會(huì)繪制重疊的圖形,不能一張一張的繪制出來(lái).那么其中調(diào)用的update()到底是起到什么樣的作用呢?
update():清除當(dāng)前顯示并調(diào)用paint()方法.當(dāng)然這個(gè)update()方法是可以被修改的.
綜合上面的介紹可以總結(jié)出repaint()的工作原理:repaint()通過(guò)調(diào)用線程再由線程去調(diào)用update()方法清除當(dāng)前顯示并再調(diào)用paint()方法進(jìn)行繪制下一個(gè)需要顯示的內(nèi)容.這樣就起到了一種圖片的交替顯示從而在視角上形成了動(dòng)畫(huà).
下面的代碼是我寫(xiě)的相關(guān)的例子,僅供大家參看,如有什么不足,請(qǐng)大家指教啊
,共同學(xué)習(xí)啊,
該代碼的功能的是實(shí)現(xiàn)動(dòng)態(tài)的畫(huà)線:
?
//主類(lèi) import javax.swing.*; import java.awt.event.*; public class FrameDraw extends JFrame// implements MouseListener { private DrawPanel panel=null; public FrameDraw(){ panel=new DrawPanel(); this.add(panel); this.setVisible(true); this.setSize(300,300); } public static void main(String[] args) { new FrameDraw(); } }
調(diào)用的類(lèi):
?
?
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DrawPanel extends JPanel implements MouseListener { static int x=0,x1=0,y=0,y1=0; public DrawPanel(){ this.addMouseListener(this); } public void paint(Graphics g){ super.paint(g); Image image=Toolkit.getDefaultToolkit().getImage("images/psu.jpg"); g.drawImage(image,0,0,300,300,this); g.drawLine(x,y,x1,y1); } public void mouseClicked(MouseEvent e){ //獲取起點(diǎn)坐標(biāo) if(e.getButton()==MouseEvent.BUTTON3){ x=e.getX(); y=e.getY(); //label.setText("鼠標(biāo)點(diǎn)擊的位置 啟動(dòng)坐標(biāo):"+" "+"x...."+x+"y...."+y); System.out.println("x..."+x+"...."+y); } //獲取終點(diǎn)坐標(biāo) if(e.getButton()==MouseEvent.BUTTON1){ x1=e.getX(); y1=e.getY(); System.out.println("終點(diǎn)的坐標(biāo)..."+x1+"..."+y1); //當(dāng)左擊的時(shí)候,進(jìn)行連線 if(y>=0||x>=0) { this.repaint(); this.validate(); } else System.out.println("數(shù)據(jù)出錯(cuò)。。。"); } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public static void main(String[] args) { new DrawPanel(); } }
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
