2012-07-15 76 views
1

我想在延遲後一次將正方形添加到jpanel上。我的程序工作正常,直到我嘗試用setBackgound()更改背景顏色。它沒有改變。我制定了我必須在我的paintComponent方法中調用super.paintComponent(gr)。但是當我這樣做並調用repaint()時,只顯示當前的方塊。前一個已經消失了。我知道這是因爲重繪每次都會顯示一個全新的面板,但爲什麼當我不調用super.paintComponent()時會起作用。以下是代碼的簡化版本:延時向jpanel添加多個形狀

import java.awt.*; 
import javax.swing.*; 

public class Squares extends JFrame{ 
    aPanel ap = new aPanel(); 
    SlowDown sd = new SlowDown(); //slows down program by given number of milliseconds 

    public Squares(){ 
     super("COLOURED SQUARES"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(ap); 
     ap.setPreferredSize(new Dimension(300, 300)); 
     pack(); 
     setVisible(true); 
     addSquares(); 
    } 

    private void addSquares(){ 
     sd.slowDown(500); 
     ap.changeSquare(100 , 100 , 255 , 0 , 0); 
     ap.repaint(); 

     sd.slowDown(500); 
     ap.changeSquare(200 , 200 , 0 , 0 , 255); 
     ap.repaint();  
    } 



    public static void main(String[] arguments) { 
     Squares sq = new Squares(); 
    } 


class aPanel extends JPanel{ 

    private int x = 0; 
    private int y = 0; 
    private int r = 0; 
    private int g = 0; 
    private int b = 0; 

    public void paintComponent(Graphics gr) { 
     //super.paintComponent(gr); 
     Color theColor = new Color (r, g, b); 
     gr.setColor(theColor); 
     gr.fillRect(x,y,30,30); 
    } 
    void changeSquare(int i , int j, int rd , int gr , int bl){ 
     x = i; 
     y = j; 
     r = rd; 
     g = gr; 
     b = bl; 
    } 
} 

class SlowDown{ 
    void slowDown(long delay){ 
     long t = System.currentTimeMillis(); 
     long startTime = t; 
     while(t < startTime + delay){ 
      t = System.currentTimeMillis();    
     } 
    } 
} 
} 

回答

0

因此,您可以通過很多方法來改進代碼。首先,如果要繪製多個矩形並「記住」矩形,則需要存儲過去繪製的矩形。否則會發生的是,你基本上每次都在先前繪製的矩形上繪畫。所以我建議將每個矩形存儲在某種列表中。然後在繪畫中,您可以遍歷列表並繪製每個矩形。

其次,延遲可以通過Thread.sleep()調用完成。也許這將是一個例子:

class APanel extends JPanel{ 

    List<Shape> rects; 
    private int r = 0; 
    private int g = 0; 
    private int b = 0; 

    public APanel(){ 
     rects = new ArrayList<Shape>(); 
    } 

public void paintComponent(Graphics gr) { 
    super.paintComponent(gr); 
    Color theColor = new Color (r, g, b); 
    gr.setColor(theColor); 
    for(Shape s: rects){ 
     ((Graphics2D)gr).fill(s); 
    }   
} 

void changeSquare(int i , int j, int rd , int gr , int bl){ 
    rects.add(new Rectangle2D.Double(i, j, 30, 30));   
    //we have to deal with colors 
} 
} 

現在,上面的例子可以讓你新的矩形不斷添加到列表中,每次油漆全部的矩形。如果你需要以不同的顏色繪製每個矩形,那麼你可能需要創建自己的矩形類來存儲在列表中。至於延遲,你可以這樣做:

class SlowDown{ 
    void slowDown(long delay){   
     Thread.sleep(delay); 
    } 
} 

而這應該暫停的東西延遲毫秒。

+0

我很好奇爲什麼原始代碼可以工作,如果我不使用super.paintComponent(gr)。除了不能改變背景顏色,它沒有設置ArrayList的 – user1526479 2012-07-15 07:02:42

+0

就是我想要的。它不是原始代碼是錯誤的。但這是解決問題的有限方式。特別是你有要求改變背景並在屏幕上留下方格。這就是爲什麼我建議矩形形狀的ArrayList。 – 2012-07-15 12:52:51

+0

好,但它不回答我的問題,爲什麼它的作品,如果我不打電話super.paintComponent(gr)。謝謝 – user1526479 2012-07-22 07:30:55