【问题标题】:Oracle JRE 1.8_281 GUI freezeOracle JRE 1.8_281 GUI 冻结
【发布时间】: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。 有什么建议可以找出阻止我的应用程序的原因吗?

提前感谢您的帮助, 纳丁

【问题讨论】:

    标签: java windows swing freeze


    【解决方案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");
    }
    

    【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2020-08-06
    • 2015-04-08
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2015-03-05
    相关资源
    最近更新 更多