2016-11-08 57 views
1

我试图通过显示所有的帧为BufferedImage对象和使用ThreadJPanel S代表每个paintComponent(Graphics g)方法来调用g.drawImage绘制在JPanel动画绘制任何东西框架,睡在中间。我的理解是,从任何地方调用g.drawImage,只要g是来自paintComponentGraphics对象,应该会导致更新JPanel中的像素,但JPanel中没有更改。这不是Graphics.drawImage的工作方式,还是使用另一个Thread或其他所有东西都是问题?我的代码缩写版本如下,删除不必要的位Graphics.drawImage不会的Java Swing

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); 
      } 
     }); 
    } 

} 

回答

1

您目前的绘画代码是错误的。绘画方法仅用于绘画。你永远不会从绘画方法中启动一个线程。您无法控制何时调用绘画方法,并且每次调用该方法时都会启动另一个线程。

Graphics对象只能用作绘制方法持续时间内存在的持续时间较短的对象。你不应该试图无限期地保持对象的引用。

我想画动画

如果你想要做动画,那么你使用Swing Timer安排动画。

所以你应该有图像作为类的一个属性。然后当Timer触发时,您更改图像属性并在面板上调用repaint()