Java动画程序在Linux中运行不稳定

Java动画程序在Linux中运行不稳定

我在 Ubuntu 14.4.1 中编写了一个简单的 Java 动画程序。一个球在 JPanel 内移动。但在执行时,球在 JPanel 中移动得相当不平稳。这个问题一直持续到我在 JPanel 内移动鼠标。在 JPanel 内移动鼠标时,球的移动相当流畅。应该说,我在 Windows 10 中运行过这个程序,没有出现任何问题。我的程序代码如下:

import java.awt.*;
import javax.swing.*;

public class MovingBall extends JPanel {
    Ball ball = new Ball();

    void startAnimation() {
        while( true ) {
            try {
                Thread.sleep( 25 );
                ball.go();
                repaint();
            } catch( InterruptedException e ) {}
        } // end while( true )
    } // end method startAnimation()

    protected void paintComponent( Graphics g ) {
        super.paintComponent( g );
        ball.draw( g );
    } // end method paintComponent


    class Ball {
        int x;
        int y;
        int xSpeed = 100;
        int ySpeed = 70;

        void go() {
            x = x + (xSpeed*25)/1000;
            y = y + (ySpeed*25)/1000;
            if( x < 0 ) {
                x = 0;
                xSpeed = -xSpeed;
            } else if( x > 490 ) {
                x = 490;
                xSpeed = -xSpeed;
            } else if( y < 0 ) {
                y = 0;
                ySpeed = -ySpeed;
            } else if( y > 490 ) {
                y = 490;
                ySpeed = -ySpeed;
            } // end if-else block
        } // end method go()

        void draw( Graphics g ) {
            g.fillOval( x , y , 10 , 10 );
        } // end method draw
    } // end inner class Ball


    public static void main( String[] args ) {
        JFrame window = new JFrame();
        window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        MovingBall animation = new MovingBall();
        animation.setPreferredSize( new Dimension( 500 , 500 ) );
        animation.setBackground( Color.white );
        window.add( animation );
        window.pack();
        window.setVisible( true );

        animation.startAnimation();
    } // end method main
} // end class MovingBall

有什么问题?我是否需要在 mu Ubuntu 中更改一些设置?
我还在 paintComponent 方法中放入了一些测试代码,如下所示:

protected void paintComponent( Graphics g ) {
    System.out.println( "paintComponent call number: " + counter );
    ++counter;
    super.printComponent( g );
    ball.draw( g );
}

在 MovingBall 类中声明变量计数器的初始值为 0。我观察到,每秒的 paintComponent 调用次数远远高于 JPanel 的实际刷新率。

相关内容