我使用Swing制作了一个秒表。我在JFrame上贴了标签,并使用计时器每10毫秒更改其文本。但是,仅当鼠标光标位于主窗体上时,该应用程序才能正常运行。当我将鼠标移到外面时,帧速率会缓慢下降到2 FPS-看起来像是Swing中的怪异优化。
将内容打印到System.out中,我发现计时器仍然每10毫秒触发一次,并且JLabel也每10毫秒重新绘制一次-我不知道在哪里寻找问题的根源。
这是演示问题的最小示例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test extends JFrame {
public static void main(String[] args) {
Test main = new Test();
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel lbl = new JLabel("test");
lbl.setPreferredSize(new Dimension(150, 50));
new Timer(10, new ActionListener() {
public void actionPerformed(ActionEvent e) {
lbl.setText(Long.toString(System.currentTimeMillis()));
}
}).start();
main.setLayout(new BorderLayout());
main.add(lbl);
main.pack();
main.setLocationRelativeTo(null);
main.setVisible(true);
}
}
当鼠标光标移到窗口上方时,标签会平滑更新,但是一旦光标离开窗口,标签就会每秒更新两次。
更新
JDK 1.8.0_121会重现该问题,而1.7.0_75不会。这是一个JDK错误吗?我可以在不降级到Java 7的情况下解决它吗?