我想在延遲後一次將正方形添加到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();
}
}
}
}
我很好奇爲什麼原始代碼可以工作,如果我不使用super.paintComponent(gr)。除了不能改變背景顏色,它沒有設置ArrayList的 – user1526479 2012-07-15 07:02:42
就是我想要的。它不是原始代碼是錯誤的。但這是解決問題的有限方式。特別是你有要求改變背景並在屏幕上留下方格。這就是爲什麼我建議矩形形狀的ArrayList。 – 2012-07-15 12:52:51
好,但它不回答我的問題,爲什麼它的作品,如果我不打電話super.paintComponent(gr)。謝謝 – user1526479 2012-07-22 07:30:55