paint,repaint,update,這3個(gè)都跟繪圖有關(guān)系的相關(guān)的方法把。
這3個(gè)雖然以前用過(guò),但是但是沒有完全理解。
下面這個(gè)段話是轉(zhuǎn)載的(感覺講的比較好):
repaint()這個(gè)方法是一個(gè)具有刷新頁(yè)面效果的方法,如果你要頁(yè)面進(jìn)行重畫就可以調(diào)用.
從上面的流程圖可以看出,在繪制動(dòng)畫圖形時(shí)候如果沒有調(diào)用repaint()方法的時(shí)候直接就是由線程調(diào)用paint()方法進(jìn)行繪制,用 repaint()進(jìn)行刷新顯示.但是這樣的動(dòng)畫會(huì)有個(gè)缺點(diǎn)(這樣的效果繪制出來(lái)會(huì)有閃爍).想想做出來(lái)的動(dòng)畫總是隔一段時(shí)間就閃爍,有人會(huì)看嗎?那么應(yīng) 該怎么去除閃爍呢?我再下面的文章中會(huì)講到.這里主要的是說(shuō)明repaint()這個(gè)方法.
在調(diào)用了repaint()的時(shí)候我門可以看 出,它并不是直接就去繪制動(dòng)畫(調(diào)用paint()),而是通過(guò)調(diào)用AWT線程在由線程去調(diào)用另一個(gè)方法update()再由update()調(diào)用畫筆 paint()方法進(jìn)行繪制. 那么這里為什么要多做一步呢?這樣是不是為我門多增加代碼的書寫量呢?回答是當(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)畫.
下面的代碼是我寫的相關(guān)的例子,僅供大家參看,如有什么不足,請(qǐng)大家指教啊
,共同學(xué)習(xí)啊,
該代碼的功能的是實(shí)現(xiàn)動(dòng)態(tà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)用的類:
?
?
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
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

