另一个线程的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
spaintComponent(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()