2017-06-12 98 views
1

下面的代碼應該顯示一個紅色的矩形,但事實上它不起作用。但是,如果我取消paint方法,它的工作;看起來g.drawImage(app.img, 0, 0, f)main方法不起作用。什麼是問題和解決方案?Graphics.drawimage不起作用

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 

public class LoadImageApp extends Component { 
    private static final int SCREEN_WIDTH = 400; 
    private static final int SCREEN_HEIGHT = 300; 
    BufferedImage img; 

// public void paint(Graphics g) { 
//  g.drawImage(img, 0, 0, null); 
// } 

    public LoadImageApp() { 
     img = new BufferedImage(SCREEN_WIDTH, 
       SCREEN_HEIGHT, BufferedImage.TYPE_3BYTE_BGR); 
     byte[] b = ((DataBufferByte) img.getRaster().getDataBuffer()) 
       .getData(); 
     for (int i = 0; i < img.getWidth() * img.getHeight(); i++) { 
      b[i * 3] = 0; 
      b[i * 3 + 1] = 0; 
      b[i * 3 + 2] = (byte)0xff; 
     } 

    } 

    public Dimension getPreferredSize() { 
     if (img == null) { 
      return new Dimension(100, 100); 
     } else { 
      return new Dimension(img.getWidth(null), img.getHeight(null)); 
     } 
    } 

    public static void main(String[] args) { 

     JFrame f = new JFrame("Load Image Sample"); 

     f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     LoadImageApp app = new LoadImageApp(); 
     f.add(app); 
     f.pack(); 
     f.setVisible(true); 
     Graphics g = app.getGraphics(); 
     g.drawImage(app.img, 0, 0, f); 
    } 
} 

回答

1

你的代碼工作,但它可能看起來像什麼也沒發生,因爲g.drawImage(app.img, 0, 0, f); main方法啓動時只被調用一次,並且圖像一旦窗口再次更新隱藏。

爲了解決這個問題,您需要將圖像添加到組件,以便它自動更新/繪製,或覆蓋您所提到的public void paint(Graphics g)方法。

編輯: 如果你堅持使用油漆覆蓋,不要僞造你的組件油漆方法的超級調用,否則不會繪製任何子組件或其他油漆相關的項目。

public void paint(Graphics g) { 
    super.paintComponents(g); 
    g.drawImage(img, 0, 0, null); 
} 

如果圖像是一個背景,你可以把後super.paintComponentsg.drawimage