另一个线程的Graphics.drawImage不会在Java Swing中绘制任何内容

另一个线程的Graphics.drawImage不会在Java Swing中绘制任何内容,java,multithreading,image,swing,graphics,Java,Multithreading,Image,Swing,Graphics,我试图在JPanel中绘制动画,方法是将所有帧显示为buffereImage对象,并使用线程调用JPanelspaintComponent(Graphics g)方法中的g.drawImage,在每个帧之间睡觉。我的理解是,只要从任何地方调用g.drawImage,只要g是paintComponent中的Graphics对象,就会导致JPanel中的像素更新,但JPanel中没有变化。这不是Graphics.drawImage的工作方式,还是使用另一个线程的问题,或者其他问题?下面是我的代码的缩

我试图在
JPanel
中绘制动画,方法是将所有帧显示为
buffereImage
对象,并使用
线程
调用
JPanel
s
paintComponent(Graphics g)
方法中的
g.drawImage
,在每个帧之间睡觉。我的理解是,只要从任何地方调用
g.drawImage
,只要
g
paintComponent
中的
Graphics
对象,就会导致
JPanel
中的像素更新,但
JPanel
中没有变化。这不是
Graphics.drawImage
的工作方式,还是使用另一个
线程的问题,或者其他问题?下面是我的代码的缩写版本,删除了不必要的部分

class Example extends JPanel{

    public Dimension getPreferredSize(){
        return new Dimension(500, 500);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        draw(g);
    }

    public void draw(Graphics g){
        BufferedImage temp1;
        BufferedImage temp2;
        try{
            temp1 = ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\test1.png"));
            temp2 = ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\test2.png"));
        }catch(IOException e){
            temp1 = null;
            temp2 = null;
        }
        final BufferedImage image1 = temp1;
        final BufferedImage image2 = temp2;
        Thread drawThread = new Thread(new Runnable(){
            public void run(){
                g.drawImage(image1, 0, 0, null);
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    // omitted
                }
                g.drawImage(image2, 0, 0, null);
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    // omitted
                }
            }
        });
        drawThread.start();
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new B());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
           }
        });
    }

}

您当前的绘画代码是错误的。绘画方法只适用于绘画。你永远不会从绘画方法开始一条线。您无法控制何时调用绘画方法,每次调用该方法时,您都会启动另一个线程

图形对象只能用作在绘制方法期间存在的短期对象。您不应该试图无限期地保留对对象的引用

我想画一个动画

如果要制作动画,则可以使用来计划动画

因此,应该将图像作为类的属性。然后,当
计时器
触发时,您可以更改图像属性,并在面板上调用
repaint()