Я строю секундомер, используя 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?