Java Graphics.drawimage不';行不通

Java Graphics.drawimage不';行不通,java,graphics,drawimage,Java,Graphics,Drawimage,下面的代码应该显示一个红色矩形,但实际上它不起作用。然而,如果我取消注释paint方法,它就会工作;似乎main中的g.drawImage(app.img,0,0,f)方法不起作用。问题和解决方案是什么 import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; public class LoadImageApp exten

下面的代码应该显示一个红色矩形,但实际上它不起作用。然而,如果我取消注释
paint
方法,它就会工作;似乎
main
中的
g.drawImage(app.img,0,0,f)
方法不起作用。问题和解决方案是什么

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);
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.image.buffereImage;
导入java.awt.image.DataBufferByte;
公共类LoadImageApp扩展组件{
专用静态最终int屏幕_宽度=400;
专用静态最终整屏高度=300;
缓冲图像img;
//公共空间涂料(图g){
//g.drawImage(img,0,0,null);
//    }
公共LoadImageApp(){
img=新的缓冲区图像(屏幕宽度,
屏幕高度、缓冲区图像。类型为3字节(BGR);
字节[]b=((数据缓冲字节)img.getRaster().getDataBuffer())
.getData();
对于(int i=0;i
您的代码正在工作,但看起来好像什么也没有发生,因为
g.drawImage(app.img,0,0,f)仅在主方法启动时调用一次,并且一旦窗口更新,图像将再次隐藏

要解决此问题,您需要向组件添加一个图像,使其自动更新/绘制,或覆盖您提到的
public void paint(Graphics g)
方法

编辑: 如果您坚持使用“绘制覆盖”,请不要伪造对组件绘制方法调用super,否则将不会绘制任何子组件或其他与绘制相关的项目

public void paint(Graphics g) {
    super.paintComponents(g);
    g.drawImage(img, 0, 0, null);
}
如果图像是背景,您可以将
super.paintComponents
放在
g.drawimage