当我将游戏鼠标移到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);
}
}
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);
}
}
答案 0 :(得分:1)
我解决了这个问题,因为我将鼠标的轮询率从1000Hz降低到500Hz。现在一切都很完美。我认为问题在于UI-Thread过度扩展,每秒处理1000个民意调查,因此忙于为GIF制作动画。