我試圖通過顯示所有的幀爲BufferedImage
對象和使用Thread
在JPanel
S代表每個paintComponent(Graphics g)
方法來調用g.drawImage
繪製在JPanel
動畫繪製任何東西框架,睡在中間。我的理解是,從任何地方調用g.drawImage
,只要g
是來自paintComponent
的Graphics
對象,應該會導致更新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);
}
});
}
}