2016-11-08 58 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()