我试图通过显示所有的帧为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);
}
});
}
}