私は非常に単純なアニメーションを持っています。大きなフォントのテキストが連続的に (ピクセルごとに) 左に移動します。テキストは最初に画像に変換され、次にタイマー タスクが開始され、繰り返し (10 ~ 20 ミリ秒ごとに) 画像の x 座標が 1 減分され、repaint() が実行されます。
このプログラムは、一部のシステムで奇妙な動作を示します。nVidia カードを搭載した私の PC では、スムーズに動作します。私の Vaio ノートブック、BeagleBoneBlack、および友人の Mac では、ひどく途切れます。しばらく静止しているように見えますが、左に約 10 ピクセルジャンプし、再び一時停止というように続きます。
私が困っているのは、これらのシステムでは、マウスに触れていない場合にのみアニメーションが途切れるという事実です。ウィンドウ内でマウス カーソルをゆっくり動かしたり、ウィンドウ自体をドラッグしたりする限り、アニメーションは完全にスムーズに実行されます。
誰でもこれを説明できますか?プログラムは次のとおりです。
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
class Textimg extends JComponent
{
    String      str;
    Font        font;
    int         x = 0;
    final int   ytext = 136;
    Image       img;
    public Textimg(String s)
    {
        str = s;
        font = new Font("Noserif", Font.PLAIN, 96);
        setLayout(null);
    }
    protected void paintComponent(Graphics g)
    {
        if (img == null)
        {
            img = createImage(4800, 272);
            Graphics gr = img.getGraphics();
            gr.setFont(font);
            gr.setColor(Color.BLACK);
            gr.fillRect(0, 0, 4800, 272);
            gr.setColor(new Color(135, 175, 0));
            gr.drawString(str, 0, ytext);
            gr.dispose();
        }
        g.drawImage(img, x, 0, this);
    }
    public void addX(int dif)
    {
        if (isVisible())
        {
            x = x + dif;
            Graphics g = getGraphics();
            if (g != null) paintComponent(g);
        }
    }
} 
public class Banner extends JFrame 
{ 
    StringBuffer    buf;
    int             sleeptime = 10;
    Banner(String path) throws IOException 
    { 
        setSize(new Dimension(480, 272));
        setTitle("Java Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(path), "UTF-8"));
        buf = new StringBuffer();
        while (true) 
        {
           String line = reader.readLine();
           if (line == null) break;
           buf.append(line);
        }
        final Textimg textimg = new Textimg(buf.toString());
        add(textimg);
        textimg.setBounds(0, 0, 480, 272);
        final javax.swing.Timer timer = new javax.swing.Timer(200, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                textimg.addX(-1);
            }
        });
        timer.setDelay(sleeptime);
        timer.start();
    }
    //----------------------------------------------------------------------
    public static void main(String[] args) throws Exception
    {
        new Banner(args[0]).setVisible(true);
    }
}
    