2017-04-05 4 views
0

JPanel을 사용하고 있는데 패널을 클릭하면 사각형이 그려집니다. 클릭 한 후에는 새 모양을 표시하고 이전 모양은 삭제합니다. 나는 이전의 도형이 제거되지 않는 이유를 모르지만 어떤 것을 시도했습니다.Jpanel 페인팅이 지워지지 않았습니다.

public class Canvas extends JPanel { 

private BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB); 
private Graphics2D graphics = image.createGraphics(); 

Canvas() { 

    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      drawShapeAt(e.getX(), e.getY()); 
      repaint(); 

     } 
    }); 

} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image,0,0,this); 
} 


public void drawShapeAt(int x, int y) { 

    graphics.setColor(Color.blue); 
    graphics.fill(new RegularPolygon(x, y, 100, 5)); 

} 

}

나는 또한 내 JFrame의에이를 호출합니다. 내가 클릭하지만, 이전의 것들 removed..I 생각되지 않는 경우

Canvas mouse=new Canvas(); 
    this.add(mouse, BorderLayout.CENTER); 
    mouse.drawShapeAt(250,250); 

형상이 잘 그려, 중심입니다()와 super.paintComponent (g)가 제거 될 칠 사용하여, 그게 내가 붙어있어 ...

+0

'이미지'자체에 무언가를 그리는 중입니다. 패널이 지워지지 만 이미지에 그려진 모양은 그대로 유지됩니다. – Titus

+0

아, 알겠습니다. 그럼 내가 어떻게 이미지를 지울 수 있을지 아십니까? LE : 알겠습니다. clearRect()를 사용해야합니다. – Gimv30

+0

전체 이미지를 단일 색상 (투명도)으로 채울 수 있습니다. – Titus

답변

4

오직 하나의 도형을 그려야한다면, Buffered 이미지가 필요 없습니다. BufferedImage를 클리어하고, BufferedImage에 페인트하고, 마지막으로 paintComponent (...) 메소드에서 BufferedImage를 다시 칠하는 것은 여분의 오버 헤드입니다.

대신 클래스에 인스턴스 변수 (예 : startX/startY)를 만든 다음이 변수를 기반으로 paintComponent (...) 메소드에서 사각형을 그립니다. BufferedImage가 필요 없습니다. 이것이 스윙 컴포넌트가 스스로 칠하는 방식입니다. Graphics 메서드를 사용하여 직접 페인트하면됩니다.

일반적으로 정적 인 복잡한 그림이있는 경우에만 BufferedImage가 사용됩니다.

Custom Paining에있는 스윙 튜토리얼의이 접근법의 실제 예를 읽어보십시오.

여러 개의 직사각형을 그리려면 BufferedImage 만 사용합니다. Custom Painting Approaches을 확인할 수도 있습니다. BufferedImage를 지우는 법을 보여줍니다.

관련 문제