Yak*_*hzi 7 java macos swing timer animated-gif
当我将游戏鼠标移动到a中时javax.swing.JFrame,所有动画GIF(javax.swing.ImageIcon在a内javax.swing.JLabel)停止动画直到鼠标停止移动.
这只是一个游戏鼠标与司机发生的MacOS(与火箭通力XTD和两台计算机上的Razer游戏鼠标测试过).当我使用其他鼠标时,一切正常.
游戏鼠标也导致javax.swing.Timers停止调用他们的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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我将鼠标的轮询率从 1000Hz 降低到 500Hz,从而解决了这个问题。现在一切都很完美。我认为问题在于 UI 线程在处理每秒 1000 个轮询时过度扩展,因此忙于制作 GIF 动画。