2011-09-27 63 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(new Dimension(30,22));在paint方法之外,讀取API,因爲還有其他方法如何爲g.drawImage設置大小() – mKorbel

+0

非常感謝。在paint方法之外移動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

使用setPreferredSize()而不是setSize更好嗎? – tiger

+1

佈局管理器更可能遵守組件大小的首選(以及最大和最小)大小。那麼簡短的回答:是的。 –

2

我建議你移出從paint方法加載的圖像。它看起來很靜態,並且對於Canvas的每次重繪,圖像將被重載,發生很多次,並且這將發生在事件派發線程上。