当我在 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);
}
}