2016-02-14 51 views
0

我已經寫了下面的例子來給出一些我可能遇到的問題。當您按下按鈕時,controlWhichImage將切換到2.問題是,當它從原始圖像切換到副本時,圖像消失。如何複製bufferedImage

public class PainterDemo01 extends JPanel implements ActionListener { 
    BufferedImage createdImage; 
    BufferedImage img; 
    int controlWhichImage; 
    JFrame mainFrame; 
    JButton changePicture; 

    public PainterDemo01(){ 
     changePicture = new JButton("Press"); 
     changePicture.addActionListener(this); 
     controlWhichImage = 1; 
     mainFrame = new JFrame(); 
     mainFrame.add(this); 
     this.add(changePicture); 
     mainFrame.setPreferredSize(new Dimension(600,600)); 
     mainFrame.setVisible(true); 
     mainFrame.pack(); 
     img = loadImage();  
    } 

    public BufferedImage loadImage(){ 
     img = null; 
     try { 
      img = ImageIO.read(new File("/home/gerry/Desktop/100_0647.JPG")); 
     } catch (IOException e){ 
      System.out.println("no file here"); 
     } 
     return img; 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g);   

     loadImage(); 
     if (createdImage == null){ 
      this.createdImage = new BufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     } 

     Graphics g2 = this.createdImage.getGraphics();  

     if (controlWhichImage == 1){ 
       g2.drawImage(img,0,0,img.getWidth(),img.getHeight(),null); 
       g.drawImage(img, 0,0,img.getWidth(),img.getHeight(),null);  
       g2.dispose(); 
      } 
     if (controlWhichImage == 2){ 
       //Draw bufferedImage on to to JPanel 
       g.drawImage(this.createdImage,this.createdImage.getWidth(),this.createdImage.getHeight(),null); 
     }    
    } 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     controlWhichImage = 2; 
     repaint(); 
    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
      java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new PainterDemo01().setVisible(true); 
      } 
     }); 
    }  
} 

回答

0

當然!你必須去郊外繪製圖像。請使用這個

g.drawImage(this.createdImage, 0, 0, this.createdImage.getWidth(),this.createdImage.getHeight(),null); 
0

使用img OBJ以來已經實例但不createdImage OBJ,createdImage包含null因爲它只是宣告但尚未實例化。如果您使用createdImage obj表示如果您對createdImage obj執行任何操作,則將獲得NullPointerException

Graphics g2 = this.img.getGraphics(); 
--------- 
+0

我試圖whith this.image它仍然消失,但謝謝你。 – Gerry

+0

作出這些改變,它仍然消失。 – Gerry

+0

謝謝大家的回答 – Gerry

1

的問題是,getGraphics(或更好的命名createGraphics)被稱爲if語句外,還爲2,因此,既造成資源泄漏(因爲沒有調用g2.dispose),也是一個乾淨的石板。

if (controlWhichImage == 1) { 
     Graphics g2 = createdImage.getGraphics();  
     g2.drawImage(img,0,0,img.getWidth(),img.getHeight(),null); 
     g2.dispose(); 
    } 

還可以執行諸如將圖像加載到繪圖代碼之外的操作。