游戏鼠标移动时,GIF停止动画

7

当我在 javax.swing.JFrame 中移动我的游戏鼠标时,所有带有动画的 GIF(javax.swing.ImageIcon 内嵌于 javax.swing.JLabel)都会停止动画,直到鼠标停止移动。

这种情况只会出现在使用驱动程序的游戏鼠标上的 macOS 上(我已经在两台计算机上测试了 Rocket-Kone XTD 和 Razer 游戏鼠标)。当我使用其他鼠标时,一切正常。

游戏鼠标也会导致 javax.swing.Timer 停止调用它们的 actionPerformed() 方法。我在此处开了一个线程来解决这个问题,但可以使用 java.util.TimerTask 来解决。(编辑:实际上 TimerTask 也无法解决,因为 JFrame 直到鼠标停止移动才会重绘。)

但是我没有找到替代方案来播放 GIF 动画。我更感兴趣的是解决问题,而不是使用替代方案,尽管对于有效的替代方案,我也会心存感激。

代码:

import java.lang.reflect.InvocationTargetException;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Mouse {
    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    new Mouse();
                }

            });
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public Mouse() {
        JFrame frame = new JFrame();
        JLabel label = new JLabel(new ImageIcon(getClass().getResource("waiting.gif")));

        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        frame.add(label);
    }
}

运行应用程序:

输入图像描述

最小可复现的示例(MCVE):

import java.lang.reflect.InvocationTargetException;
import java.net.*;
import javax.swing.*;

public class Mouse {
    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    try {
                        new Mouse();
                    } catch (MalformedURLException ex) {
                        ex.printStackTrace();
                    }
                }

            });
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public Mouse() throws MalformedURLException {
        JFrame frame = new JFrame();
        JLabel label = new JLabel(new ImageIcon(
                new URL("https://istack.dev59.com/HXCUV.gif")));

        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        frame.add(label);
    }
}

1
我在编辑中添加了一个 [mcve]。您在 MCVE 中是否看到相同的行为? - Andrew Thompson
没错,这没有任何区别。 - Yakuhzi
哦,这里运行得很好。在示例中添加一些代码以转储JRE的Java版本/微版本。 - Andrew Thompson
你在Mac上用游戏鼠标测试过了吗? - Yakuhzi
不,使用标准鼠标的Windows系统。您尝试过其他鼠标吗?在其他操作系统上呢? - Andrew Thompson
是的,这只出现在使用游戏鼠标的 Mac 上。使用标准鼠标一切正常。 - Yakuhzi
1个回答

1
我将鼠标的轮询率从1000Hz降低到500Hz,问题得以解决。现在一切都完美运行。我认为问题在于UI线程过度处理每秒1000个轮询,导致它太忙了,无法播放GIF动画。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接