2012-07-15 5 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 
} 
} 

지금, 위의 예는 지속적으로 목록에 새 사각형을 추가 할 수 있습니다 때마다 모든 사각형을 페인트. 각 사각형을 다른 색상으로 칠하려면 List에 저장할 고유 한 사각형 클래스를 만들어야합니다. 지연에 관해서는 다음과 같이 할 수 있습니다.

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

지연 밀리 초 동안 작업을 일시 중지해야합니다.

+0

super.paintComponent (gr)를 사용하지 않으면 왜 원래 코드가 작동하는지 궁금합니다. 배경색을 변경할 수 없다는 것을 제외하면 ArrayList의 – user1526479

+0

을 설정하지 않고 원하는 것을 수행합니다. 원래 코드가 잘못 되었음이 아닙니다. 그러나 문제를 해결하는 것은 제한된 방법이었습니다. 특히 배경을 변경하고 사각형을 화면에 남겨 두어야한다는 요구 사항이 있습니다. 그래서 Rectangle Shape의 ArrayList를 제안합니다. –

+0

그래도 super.paintComponent (gr)를 호출하지 않으면 왜 작동하는지에 대한 내 질문에 대답하지 않습니다. thanks – user1526479