小编Cog*_*ent的帖子

为什么Java swing计时器导致动画口吃少于睡眠?

我有两个几乎相同的类:AnimationFrame1和AnimationFrame2.这两个类都显示一个蓝色的球在500 x 500的窗口上水平来回移动.除了runAnimation()和createAndShowGUI()方法之外,这两个类是相同的.在其runAnimation()方法中,AnimationFrame1使用while循环和sleep方法创建动画循环,而AnimationFrame2使用Swing Timer.在其createAndShowGUI()方法中,AnimationFrame1创建一个新线程并在其上调用runAnimation()方法,而AnimationFrame2只调用没有新线程的runAnimation()方法.

在编译了这两个类之后,我发现使用Swing Timer的AnimationFrame2显示了一个更平滑的动画,它不会像使用while循环和sleep方法的AnimationFrame1中显示的动画那样断断续续.我的问题是:为什么AnimationFrame1在动画中显示出比AnimationFrame2更多的口吃?我一直在寻找原因,但迄今为止一无所获.

另外,我显然是Java新手,所以如果您发现我的代码有任何问题或者您知道我可以改进它的任何方式,请告诉我.

这是AnimationFrame1:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;

class AnimationFrame1 extends JPanel {

    int ovalX;
    int prevX;
    Timer timer;
    boolean moveRight;
    BufferedImage img;

    public AnimationFrame1() {
        setPreferredSize(new Dimension(500, 500));
    }

    public void runAnimation() {
        moveRight = true;
        img = null;
        ovalX = 0;
        prevX = 0;
        while(true) {
            if (moveRight == true) {
                prevX = ovalX;
                ovalX = ovalX + 4;
            }
            else {
                prevX = ovalX - 4;
                ovalX …
Run Code Online (Sandbox Code Playgroud)

java performance animation swing timer

4
推荐指数
1
解决办法
1009
查看次数

标签 统计

animation ×1

java ×1

performance ×1

swing ×1

timer ×1