지연 후 한 번에 하나씩 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
을 설정하지 않고 원하는 것을 수행합니다. 원래 코드가 잘못 되었음이 아닙니다. 그러나 문제를 해결하는 것은 제한된 방법이었습니다. 특히 배경을 변경하고 사각형을 화면에 남겨 두어야한다는 요구 사항이 있습니다. 그래서 Rectangle Shape의 ArrayList를 제안합니다. –
그래도 super.paintComponent (gr)를 호출하지 않으면 왜 작동하는지에 대한 내 질문에 대답하지 않습니다. thanks – user1526479