感谢楼上朋友给予的帮助,经过自己的一些测试,事情又有了一些新发现,我的理解如下:
在JAVA SWING的事件驱动程序中,总是存在着一个SWING事件调度线程,由它来依次管理那些捕获的事件,所以如果捕获了一个键盘事件,那么接下来在keyPressed(KeyEvent e)中执行的代码应该是由SWING事件调度线程来执行的,即事件处理代码所在的线程和程序中的main(String[] args)方法所在的主线程是两个不同的线程。
当我在一个显示动画的线程中调用repaint()方法想更新Jpanel面板的外貌时,repaint()方法是立马就返回的,而不是等面板的paintComponent()执行完后才返回的,我想面板的实际更新操作,即paintComponent()方法的调用是由SWING事件调度线程来执行的,而不是在显示动画的主线程中执行的,现在就有了一个新的问题,假设动画线程的执行顺序如下:
while(true)
{
1.计算物体应到达的位置;
2.调用repaint()方法在Jpanel上显示在该位置上的物体;
3.sleep()一段时间(做一些帧同步的处理);
}
我想要的结果是动画的显示很平滑,而我发现有时物体的移动会突然变快,然后又恢复正常的速度!所以根据上面我对线程的理解,是不是有这种意外情况:因为repaint()方法是立刻返回的,所以不管我要在面板上画的物体有多复杂,都不会阻塞动画显示的主线程,物体在面板上的实际显示是由swing事件调度线程来执行的,即面板的paintComponent()方法不是在repaint()方法内部调用的,那么我们现在就有两个线程参与此事了(动画显示的主线程和swing事件的调度线程),因为我想要的执行结果是1执行完后马上执行2;那么有没有这种可能:123都执行完后,SWING事件调度线程还没有调用Jpanel的paintComponent()方法,而动画显示的主线程又进入新的循环,再次执行1,然后事件调度线程才执行面板的更新操作,如果是这样的话,那么物体的移动就会突然变快,原因是跳过了一帧动画的显示。
不知道以上我的理解对不对,还有应该怎样解决动画显示突然变快的情况?望高手给以赐教!