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

时间:2016-11-22 13:03:37

标签: java macos swing timer animated-gif

当我将游戏鼠标移到javax.swing.JFrame内时,所有动画GIF(javax.swing.ImageIcon内的javax.swing.JLabel)都会停止制作动画,直到鼠标停止移动。

只有 macOS 上带有驱动程序的游戏鼠标(在两台计算机上使用Rocket-Kone XTD和Razer游戏鼠标进行测试)才会发生 。当我使用其他鼠标时,一切正常。

游戏鼠标也导致javax.swing.Timer停止调用他们的actionPerformed()方法。 I opened a thread here针对此问题,但可以使用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);
    }
}

正在运行的应用程序:

enter image description here

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://i.stack.imgur.com/HXCUV.gif")));

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

        frame.add(label);
    }
}

1 个答案:

答案 0 :(得分:1)

我解决了这个问题,因为我将鼠标的轮询率从1000Hz降低到500Hz。现在一切都很完美。我认为问题在于UI-Thread过度扩展,每秒处理1000个民意调查,因此忙于为GIF制作动画。