我正在尝试使用下面的代码在 JComponent 的子类中使用Java编写动画,但是此代码会导致动画中出现滞后和抖动,并且对象看起来像是“分裂”的在屏幕上快速重绘。我该如何解决这个问题?我应该在单独的线程上重绘每个项目吗?
public GameScene(){
setDoubleBuffered(true);
run();
}
...
public void run() {
Thread animation = new Thread(new Runnable() {
public void run() {
updateGraphics();
}
});
animation.start();
}
public void updateGraphics() {
while (true) {
repaint();
try {
Thread.sleep(5);
} catch (Exception ex) {
}
}
}
答案 0 :(得分:3)
而不是使用Java Timer尝试使用更适合Swing应用程序的Swing Timer。
以下是示例代码:
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();
答案 1 :(得分:2)
你很模糊地描述你的问题。
原则上,Swing并不是非常适合动画 - 速度不是主要问题 - 而是缺乏控制何时在屏幕上更新图形的可能性。
Swing不会将渲染与屏幕刷新同步。虽然它确实是双缓冲区(默认情况下),但是在显示屏幕时刷新图形仍然会发生(并且确实如此),在组件框架N的上半部分显示(例如),而框架N + 1在下半部分(因为帧更新发生在屏幕刷新位于屏幕中间的某个位置时)。
我所知道的唯一解决方案是切换到全屏模式(http://docs.oracle.com/javase/tutorial/extra/fullscreen/),其中渲染可以是光束同步的。窗口显示没有解决方案(据我所知)。