2011-12-06 2 views
3

그림을로드하고 GUI 형식으로 표시하고 사용자가 일부 변형을 적용하고 변형 된 그림을 표시 할 수있는 간단한 Java 응용 프로그램을 작성해야합니다. 다시 그리기 방법은 너무 자주 호출하기 때문에 , 내 솔루션은 잘 작동하지만, UI가 조금 점멸 (예를 들어 JSlider에와 이미지 스케일링 사용자는 경우)Java 스윙 - 캔버스 그래픽 깜박임

내 코드는 다음과 같습니다

public class ImageCanvas extends Canvas 
{ 
    private BufferedImage image; 
    // ... 

    @Override 
    public void paint(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     if(image != null) 
     { 
      // I draw out the image... 
     } 
    } 

    public void setImage(BufferedImage image) 
    { 
     this.image = image; 
     this.repaint(); 
    } 

    public void setRotation(double rotation) 
    { 
     this.rotation = rotation; 
     this.repaint(); 
    } 

    public void setScale(double scaleX, double scaleY) 
    { 
     //set the scaling field, then repaint .... 
    }  

    // and so on... 
} 

물론 메인 UI에 ImageCanvas 컨트롤이 있습니다. 캔버스 영역을 다시 칠하는 공용 메서드 (위의 "setRotation"메서드 참조) 만 호출하면됩니다. 나는 간단한 질문이지만 캔버스에 DoubleBuffered 속성을 찾지조차 모른다 ...

도움을 주시면 감사하겠습니다.

답변

7

스윙 (즉, JComponent에서 파생 된) 클래스에 더블 버퍼링이 내장되어 있습니다.

내장 된 이중 버퍼링을 원할 경우 Canvas가 아닌 JPanel을 확장하고 이 아닌 paint을 재정의해야합니다.

+0

JCanvas가 없습니다 ... JPanel을 사용해야합니까? – asdfghjkl

+0

@asdfghjkl : 예, JPanel이며'paint'가 아닌'paintComponent'를 오버라이드합니다. 위의 답변을 수정하여 수정했습니다. –

+0

좋아요, JPanel에서 작동합니다. 이것이 스윙의 "모범 사례"가 될 수 있거나 해킹이되는지는 모르겠지만 감사합니다. – asdfghjkl

-1

일반적으로 이러한 응용 프로그램에서 그래픽 지연은 스크립트의 맨 위에 빈 변수를 설정 한 다음 해당 값을 변경 한 다음 다시 칠하기가 업데이트를 기다리는 동안 발생할 수 있습니다. 변경 방법을 시도해 볼 수 있습니다 :

setRotation(double rotation); 

해당 방법으로 이미지를 회전 할 수 있습니다.

그래픽을 다루는 동안 나는 일반적으로 보입니다.

+0

은 두 번 이상 읽은 후에도 나에게 전혀 이해가되지 않습니다. "보통 느리게"아무것도 "빈 변수"도 "스크립트"도 없습니다. 비어있는 것은 코드 스 니펫입니다. – kleopatra

+0

전체 코드를 게시하지 않으 셨다면 죄송합니다. 당신은 완전한 도움을 얻지 못할 것입니다. – Matt

1

JPanel을 사용할 수있는 경우에는 사용하십시오. JPanel.paint 메소드를 재정의하지 말고 JPanel.paintComponent을 대체하십시오. 자세한 내용은 link을 참조하십시오.