2011-09-27 4 views
1

캔버스에 이미지를 추가 한 다음 해당 캔버스를 패널에 표시했습니다. 그러나 창을 최소화 한 다음 최대화하면 이미지가 패널에서 사라집니다. 이 문제를 어떻게 해결할 수 있습니까? 다음은 코드입니다.이미지가 최소화 된 창에서 사라짐

public class CloseCanvas extends Canvas{ 

    private static final long serialVersionUID = 2L; 

    @Override 
    public void paint(Graphics g) { 
     setSize(new Dimension(30,22)); 
     BufferedImage image = null; 

     try { 
      image = ImageIO.read(new File("res/close.png")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

     g.drawImage(image, 0, 0, null); 

    } 
} 
+0

이것은 AWT 구성 요소가 무거울 때 문제가 될 수 있습니다. 대신 JPanel을 서브 클래스로 만들고 패널에 직접 페인트 칠하지 않으시겠습니까? – Thomas

+2

move setSize (새 치수 (30,22)); 페인트 방법의 외부에서 API를 읽는 방법은 다른 방법이 있기 때문에 g.drawImage()에 대한 크기를 설정하는 방법 – mKorbel

+0

많은 감사. 페인트 메서드 밖으로 setSize를 이동하면 문제가 해결됩니다. – tiger

답변

2

여기에는 Fredrik 및 mKorbel의 조언과 직접적인 문제와 관련없는 몇 가지 도움말이 포함되어 있습니다.

public class CloseCanvas extends Canvas{ 

    private static final long serialVersionUID = 2L; 
    BufferedImage image = null; 

    CloseCanvas() { 
     try { 
      image = ImageIO.read(new File("res/close.png")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     setPreferredSize(new Dimension(30,22)); 
    } 


    @Override 
    public void paint(Graphics g) { 
     if (image!=null) { 
      g.drawImage(image, 0, 0, this); 
     } 
    } 
} 
+0

setSize 대신 setPreferredSize()를 사용하는 것이 더 낫습니까? – tiger

+1

레이아웃 관리자는 구성 요소의 크기보다 선호되는 (최대 및 최소) 크기를 존중할 가능성이 큽니다. 그래서 짧은 대답 : 네. –

2

페인트 방법에서 이미지로드를 이동하는 것이 좋습니다. 그것은 꽤 정적 및 캔버스의 모든 repaint에 대한 이미지가 많은, 여러 번 발생하고 그것이 이벤트 발송 스레드에서 일어날 것입니다로드됩니다.

관련 문제