Oracle JRE 1.8_281 GUI 冻结
Posted
技术标签:
【中文标题】Oracle JRE 1.8_281 GUI 冻结【英文标题】:Oracle JRE 1.8_281 GUI freeze 【发布时间】:2021-07-19 19:36:30 【问题描述】:我正在寻求帮助来解决问题。 我正在使用 DockingFrames 开发一个摇摆应用程序(尽管它是一个非常好的库,但不再受支持)。 由于 oracle JRE 1.8_281 - 仅在 Windows 上测试,在 DragEnter 文件中,我的应用程序冻结。 所有记录器上都没有更多输出(列表很大:java.awt.focus.Component、java.awt.focus.Component、java.awt.focus.DefaultKeyboardFocusManager、所有焦点事件到摘要)。 当冻结出现时,不再触发事件。 在调试时,使用 eclpise,应用程序可能会暂停。 堆栈中没有出现阻塞线程,出现冻结时AWT线程总是在WInputMethod.endCompositionNative()中。
Thread [AWT-EventQueue-0] (Suspended)
owns: InputMethodContext (id=98)
owns: Component$AWTTreeLock (id=99)
WInputMethod.endCompositionNative(int, boolean) line: not available [native method]
WInputMethod.endComposition() line: 456
InputMethodContext(InputContext).endComposition() line: 913
InputMethodContext(InputContext).focusGained(Component) line: 321
InputMethodContext(InputContext).dispatchEvent(AWTEvent) line: 245
InputMethodContext.dispatchEvent(AWTEvent) line: 196
StackDockStation$Background(Component).dispatchEventImpl(AWTEvent) line: 4821
StackDockStation$Background(Container).dispatchEventImpl(AWTEvent) line: 2297
StackDockStation$Background(Component).dispatchEvent(AWTEvent) line: 4711
DefaultKeyboardFocusManager(KeyboardFocusManager).redispatchEvent(Component, AWTEvent) line: 1954
DefaultKeyboardFocusManager.typeAheadAssertions(Component, AWTEvent) line: 1015
DefaultKeyboardFocusManager.dispatchEvent(AWTEvent) line: 639
StackDockStation$Background(Component).dispatchEventImpl(AWTEvent) line: 4760
StackDockStation$Background(Container).dispatchEventImpl(AWTEvent) line: 2297
StackDockStation$Background(Component).dispatchEvent(AWTEvent) line: 4711
此错误不会在 Java OpneJDK jre-8.0.282.08-hotspot 或 JDK 11 上重现。 该错误仍然存在于最新的 Oracle JRE 1.8_292 中。
我不知道问题是由于我的应用程序还是 JRE。 有什么建议可以找出阻止我的应用程序的原因吗?
提前感谢您的帮助, 纳丁
【问题讨论】:
【参考方案1】:请检查这个小程序:
public class SwingFrame extends JFrame
public SwingFrame()
super("Demo");
add(new JTextField());
setSize(300, 200);
public static void main(String args[])
EventQueue.invokeLater(() ->
new SwingFrame().setVisible(true);
);
如果 JTextField 获得焦点,则此程序在拖动输入时冻结(自 JDK 8 281 起) 我的解决方法:在窗口停用时将焦点设置在另一个组件(例如 JButton)上。
public void windowDeactivated(WindowEvent e)
button1.requestFocus();
System.out.println("The window has been deactivated");
【讨论】:
谢谢你,我试试你的测试用例,成功拖过去而不卡住。这与bugs.java.com/bugdatabase/view_bug.do?bug_id=8262446 有关吗?不幸的是,这种解决方法不适用于我的 GUI,因为 FocusEvent 由 DockingFrames 捕获和管理以上是关于Oracle JRE 1.8_281 GUI 冻结的主要内容,如果未能解决你的问题,请参考以下文章