当在 8u161 或 8u162 上运行 Swing 应用程序并且焦点在 JTextField 中并且您切换到另一个应用程序(如 Chrome)并返回该应用程序时,我的 8 核 Windows 10 PC 上的 CPU 使用率增长到 15%(好像整个核心都在忙于处理事件)。
只需运行应用程序并切换几次。 如果我单击选项卡式 Pane 中的选项卡,CPU 使用率会按预期下降到 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 的客户遇到了这个问题,所以非常感谢任何解决方法的建议。 I have filed a bug with Oracle
似乎在 8u172 b02 上工作正常
最佳答案
您的客户是否使用输入法?如果您不需要启用输入法,我建议您可以禁用它。
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame("Test");
JTabbedPane tp = new JTabbedPane();
JTextField tf = new JTextField();
tf.enableInputMethods(false); // disable IM
tp.addTab("tab 1", tf);
f.add(tp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
关于Java 8u161/8u162 使 Swing 应用程序使用 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48339199/