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 冻结的主要内容,如果未能解决你的问题,请参考以下文章

图 GUI 冻结

Mac 安装JRE 1.8

jdk从1.8降到jdk1.7失败

PyQt 4 UI 冻结

JAVA 最新 环境搭建(JDK 1.8 + Tomcat 9 + eclipse oxygen)

记一次安装新版jre