Java paintComponent方法不是绘制图像

Java paintComponent方法不是绘制图像,java,graphics,paintcomponent,drawimage,Java,Graphics,Paintcomponent,Drawimage,在将paintComponent()方法合并到程序中之前,我正在尝试使用它。但是,每当我尝试在JPanel上绘制图像时,它都不起作用。我已经把代码放在下面了。任何帮助都将不胜感激。谢谢 public class ExperimentGame extends JPanel{ Image image; public ExperimentGame(){ JFrame frame = new JFrame(); SwingUtilities.isEventDispatchThread

在将
paintComponent()
方法合并到程序中之前,我正在尝试使用它。但是,每当我尝试在
JPanel
上绘制图像时,它都不起作用。我已经把代码放在下面了。任何帮助都将不胜感激。谢谢

public class ExperimentGame extends JPanel{

Image image;

public ExperimentGame(){
    JFrame frame = new JFrame();
    SwingUtilities.isEventDispatchThread();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(this);
    frame.pack();
    frame.setSize(500,500); //my edit
    this.setBackground(Color.WHITE);
    frame.setVisible(true);
    try {
        image = ImageIO.read(this.getClass().getResource("spaceship (0).png"));
    } 
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(image, 50, 50, null);
}
}

public class ExperimentMain {

public static void main(String[] args) {
    ExperimentGame game = new ExperimentGame();
}
}

解决问题的一个小技巧是在构造函数的底部调用

this.revalidate();
this.repaint();

不过,我建议您了解一下,当模型中发生更改时,如何使用模型视图控制器来更新视图。可以找到一个例子。

为什么在我看过的所有教程中,他们都不使用您建议的代码行,但他们的程序运行良好?这是可行的,但据我所知,这不需要添加。@jmao这些代码行不应该是必需的。如果添加它们会有所不同,那么您可能需要遵守并将
main
方法更改为
EventQueue.invokeLater(()->new ExperimentGame())
,它强制您的代码在AWT事件调度线程中运行。有点奇怪,但当我按照您所说的做,然后注释掉上面的两行时,直到我将窗口拖动到更大的大小,图像才会显示。你知道为什么会这样吗?哦,等一下,同样的事情发生了,当我只是注释掉上面的两行而没有做你推荐的更改时,所以我认为你的推荐没有任何作用。