При запуске приложения Swing на 8u161 или 8u162 и фокусе находится в JTextField, и вы переключаетесь на другое приложение (например, Chrome) и обратно в приложение. Использование процессора увеличивается до 15% на моем 8-ядерном ПК с Windows 10 (как если бы весь ядро занятые обработки событий).
Просто запустите приложение и переключите его пару раз. Если я нажму на вкладку на панели с вкладками, загрузка процессора упадет до 0, как ожидалось.
public class Test {
public static void main(String... args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("Test");
JTabbedPane tp = new JTabbedPane();
tp.addTab("tab 1", new JTextField(20));
f.add(tp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
Я попытался посмотреть очередь событий, чтобы увидеть, что происходит, и это очень похоже на то, что последнее событие обрабатывается снова и снова
Если я добавлю это в вышеуказанную программу, я получаю много java.awt.event.InvocationEvent [INVOCATION_DEFAULT, runnable = sun.awt.windows.WInputMethod...
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue(){
@Override protected void dispatchEvent(AWTEvent event) {
System.out.println(event);
super.dispatchEvent(event);
}
});
Работает нормально на 8u151, 8u152 и 9.0.4
У меня много клиентов, которые обновляют до 161 и получают эту проблему, поэтому любые предложения об обходном пути очень ценятся. Я подал ошибку с Oracle
Кажется, работает нормально на 8u172 b02
Согласно openjdk это было введено 8184016 и зафиксировано 8183504