repaintjava
⑴ java中的repaint和paint
有兩點不同:1、repaint有選擇的調用update或者paintrepaint() = update或者paint,對於輕量級組件,repaint會調用paint;而對於重量級組件,會調用update。update一般的工作是清屏然後paint。至於為什麼repaint度輕量級和重量級的處理有所不同,如果你一定希望知道再追問我。你也可以自己重寫update完成自己定製的工作。2、響應方式不一樣paint立即響應,而repaint則是發出重繪請求,等待awt線程選擇合適的時間進行重繪。這就像,你是一個畫家,而你還雇了另外一個畫家——awt。有兩個方法,完成繪圖,第一交給awt線程,但是他什麼時候完成繪畫完全取決於awt的心情;第二你自己來畫,這樣更確定,但是你不得不管理許多細節。在非paint方法中,顯示的調用任何paint方法,就相當於你自己來畫;而repaint就是發出請求交給awt來畫。顯然我們應該確定究竟誰來畫,因為兩者交織的畫可能帶來沖突。比如awt正在繪制的過程中,你的程序亂入,在他繪制一半的圖片上塗塗抹抹……。當然java的設計者希望我們把繪制全權交給awt線程來畫,而不是自己來畫!因為這樣最安全和省事。但是我仍然認為在Java游戲編程中還是自己來管理繪制更加靈活。補充: 暈死,你不問我。我都和你說了,paint會馬上繪制,repaint是發出請求,awt接到這給請求之後就會等待,直到awt認為合適的時候才進行繪制。另外就是repaint會處理一些重量級組件的繪制,如Frame。但是paint只是重繪輕量級組件。至於你的程序中用repaint會防止繪制過程中的沖突;而如果你直接調用paint,立即繪制也許會造成你和awt線程同時繪制這個組件,造成沖突。你需要理解Java的GUI如何工作的。Java有一個awt線程,負責所有的繪制工作,任何繪制請求都應該交給他(也就是調用repaint),而不是自己調用paint(至少java的設計者是這樣要求我們的,為的就是防止沖突)。Java需要每一個組件管理自身的繪制。假設某容器A上有按鈕B、C、D。Java繪制一個組件A的過程是這樣的,發出繪制請求-awt接到請求-awt開始繪制-組件A繪制自身-如果A組件為容器,則調用add到該容器中的所有組件B、C、D……等等的paint方法繪制這些組件。所以定義paint方法,僅僅是因為它是awt需要的一個介面,是為了滿足「組件自身管理自身繪制方法」的要求。追問: 不好意思,只是你說的太專業了,我看不懂,那awt不知道,我只知道,原程序畫出的圓是不閃爍的,如果我這個程序把repaint()移在末尾畫出的圓就是閃爍的。說簡單點吧,不然我不懂。回答: 那應該是你的public void itemStateChanged(ItemEvent e)方法總是被激發吧?你把完整代碼貼出來補充:
⑵ java中的repaint方法
我的理解如下,老師講的有欠缺,沒有講清楚這個方法的使用范圍
java里repaint()是重繪component的方法;
component中己有的圖形發生變化後不會立刻顯示,須使用repaint方法。
⑶ Java中repaint方法具體怎麼用
你得加一個線程就可以循環播放了 可以用Timer
我把你的代碼改動了一下已經可以實現你要的效果了
public class LoadingPage extends JFrame {
DrawLoadingAnimation drawLoadingAnimation;
public LoadingPage() {
ImageIcon[] imageIcons = {
new ImageIcon("D:\\新建文件夾\\0.jpg"),
new ImageIcon("D:\\新建文件夾\\1.jpg"),
new ImageIcon("D:\\新建文件夾\\3.jpg")
};
drawLoadingAnimation = new DrawLoadingAnimation(imageIcons);
this.add(drawLoadingAnimation);
this.setSize(300, 200);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("");
this.setVisible(true);
Timer timer = new Timer(200, e -> {
drawLoadingAnimation.index = (drawLoadingAnimation.index + 1) % imageIcons.length;
repaint(1000,0,0,this.getWidth(),this.getHeight());
});
timer.start();
}
static class DrawLoadingAnimation extends JPanel {
int index = 0;
ImageIcon[] imageIcons;
public DrawLoadingAnimation(ImageIcon[] imageIcons) {
this.imageIcons = imageIcons;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(imageIcons[index].getImage(), 0, 0, this.getWidth(),this.getHeight(),null);
}
}
public static void main(String[] args) {
new LoadingPage();
}
}
⑷ java中repaint()方法到底應該怎麼用
java里repaint()是重繪component的方法;
repaint()方法用於重繪組件,該方法有下面四種形式:
1。public void repaint()
2。public void repaint(long tm)
//指定調用update方法之前等待的最大毫秒數tm
3。public void repaint(int x,int y,int width,int height)
//重繪組件的指定矩形區域
4。public void repaint(ling tm,int x,int y,int width,int height)
repaint方法不總是馬上執行,Java雖然會盡可能快的執行repaint,當Applet運行在較慢的平台上或計算機較忙時,應該考慮使用第2或4種repaint方法,指定在多長時間內必須執行repaint,否則就放棄。
repaint()這個方法是一個具有刷新頁面效果的方法,如果你要頁面進行重畫就可以調用.一般都是在AWT的圖形繪制當中調用的到.那麼該方法具體的工作原來是怎麼樣的呢?看下面的結構流程圖你就可以大概的了解了:
repaint()方法
|
|
V
AWT線程--->paint()方法-->圖形繪制
|
|
V
update()方法--->paint()方法--圖形繪制
從上面的流程圖可以看出,在繪制動畫圖形時候如果沒有調用repaint()方法的時候直接就是由線程調用paint()方法進行繪制,用repaint()進行刷新顯示.但是這樣的動畫會有個缺點(這樣的效果繪制出來會有閃爍).想想做出來的動畫總是隔一段時間就閃爍,有人會看嗎?那麼應該怎麼去除閃爍呢?我再下面的文章中會講到.這里主要的是說明repaint()這個方法.
在調用了repaint()的時候我門可以看出,它並不是直接就去繪制動畫(調用paint()),而是通過調用AWT線程在由線程去調用另一個方法update()再由update()調用畫筆paint()方法進行繪制.那麼這里為什麼要多做一步呢?這樣是不是為我門多增加代碼的書寫量呢?回答是當然不會,如果你不調用repaint()那麼就不能實現每一次的刷新顯示,就只會繪制重疊的圖形,不能一張一張的繪制出來.那麼其中調用的update()到底是起到什麼樣的作用呢?
update():清除當前顯示並調用paint()方法.當然這個update()方法是可以被修改的,我門在另一篇文章關於"雙緩沖技術"中會給大家講到這點.
綜合上面的介紹可以總結出repaint()的工作原理:repaint()通過調用線程再由線程去調用update()方法清除當前顯示並再調用paint()方法進行繪制下一個需要顯示的內容.這樣就起到了一種圖片的交替顯示從而在視角上形成了動畫.
⑸ Java JPanel中,repaint(),paint(),方法的區別
repaint方法調用時會向你的程序發送一個消息,要求重繪你的程序的窗口的無效區域。
但這個消息會首先保存到應用程序的消息隊列,並不會馬上得到處理。
每個圖形用戶界面應用程序都有一個消息循環,作用是不斷地從應用程序消息隊列提取各種消息並交由指定的方法進行處理。
所以,repaint方法的作用就是發送一個刷新窗口的消息到消息隊列,而消息循環時如果提取到了這個repaint方法發送的消息,就會調用paint方法來處理這個消息。
即repaint只負責發送消息,而消息的處理是由paint方法完成的。
所以,應該重寫paint方法,將繪圖邏輯放置其中。
⑹ java里repaint();是干什麼用的
java里repaint()是重繪component的方法;
component中己有的圖形發生變化後不會立刻顯示,須使用repaint方法。
component簡而言之,組件就是對象。C++ Builder中叫組件,Delphi中叫部件,而在Visual BASIC中叫控制項。
組件是對數據和方法的簡單封裝。C++ Builder中,一個組件就是一個從TComponent派生出來的特定對象。組件可以有自己的屬性和方法。
⑺ java中repaint()怎麼樣能只清除某一條線怎麼樣可以不清楚原來已經畫了的
一般來說你需要用一個數組或者其他數據結構來記錄畫的內容數據。然後 paint 的時候讀取數組並對應地畫到屏幕上。因為 paint 是不主動記錄數據的,所以一旦畫出來再要去掉就很麻煩,而且因為它不保存數據,所以一旦繪制區域被遮蓋或者移出了屏幕區域就會整塊被擦掉。
比如我舉個例子,你要只畫直線的話,可以用一個數組或兩個數組記錄兩端點的坐標(如果要顏色等信息就同樣可以很方便地擴展,比如加一個數組什麼的)。如果一開始是不確定線條數的你就用一個 Vector 或者 ArrayList 來做個動態數組,反正把每條線的兩端點都記錄下來,然後刪除一條線就只需要在數組中把對應的端點坐標 remove 掉,然後調用 repaint:
import java.util.Vector;
import java.awt.Graphics;
import java.awt.JPanel;
import java.awt.Point;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.KeyListener;
public class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener {
private Vector<Point> endPoints1 = new Vector<Point>();
private Vector<Point> endPoints2 = new Vector<Point>();
public MyPanel () {
addMouseListener(this);
addMouseMotionListener(this);
addKeyListener(this);
}
@Override public void paint (Graphics g) {
super.paint(g);
for (int i=0; i<endPoints1.size(); i++)
g.drawLine(endPoints1.get(i).x, endPoints1.get(i).y, endPoints2.get(i).x, endPoints2.get(i).y);
requestFocus();
}
......//其他你自己寫
public void addLine (Point p1, Point p2) {
endPoints1.add(p1);
endPoints2.add(p2);
repaint(); //在這里調用 repaint
}
public void removeLine (Point p1, Point p2) {
endPoints1.remove(p1);
endPoints2.remove(p2);
repaint(); //同樣在這里調用 repaint
}
}
剩下的包括選擇刪除哪條線之類的你自己寫吧。這是一個整條線處理的例子,就是一個矢量圖。如果只是點陣圖的話那就是類似橡皮擦的工具,在屏幕上畫一個和背景顏色相同的小矩形或者圓形覆蓋掉那個區域就行了。