调用modelToView()方法冻结Java Swing应用程序

调用modelToView()方法冻结Java Swing应用程序,java,swing,deadlock,freeze,Java,Swing,Deadlock,Freeze,我正在用Java创建一个音译工具。差不多完成了。 但是,当我输入的速度如此之快时,GUI就会冻结 因此,我调试了该应用程序,以确定命令发生的位置 对方法JTextField.modelToView(pos)的调用导致了这种情况,这进一步调用了TextUI.modelToView(jtextcomponentc,intpos) 看起来,此方法首先通过调用AbstractDocument::readLock()方法获取文本组件文档的锁,其源代码为: public synchronized final

我正在用Java创建一个音译工具。差不多完成了。 但是,当我输入的速度如此之快时,GUI就会冻结

因此,我调试了该应用程序,以确定命令发生的位置

对方法
JTextField.modelToView(pos)
的调用导致了这种情况,这进一步调用了
TextUI.modelToView(jtextcomponentc,intpos)

看起来,此方法首先通过调用
AbstractDocument::readLock()
方法获取文本组件文档的锁,其源代码为:

public synchronized final void readLock() {
    try {
        while (currWriter != null) {
            if (currWriter == Thread.currentThread()) {
                // writer has full read access.... may try to acquire
                // lock in notification
                return;
            }
            wait();
        }
        numReaders += 1;
    } catch (InterruptedException e) {
        throw new Error("Interrupted attempt to aquire read lock");
    }
}
如果当前线程不是编写器线程,则调用
wait()

但,我只是在按下空格键时对文档进行变异,我相信这在EDT中会发生。而且,
Swing
也会在EDT中对其进行变异。另外,当调用
DocumentListener.insertUpdate(DocumentEvent)
时,我正在调用
JTextField.modelToView(pos)

那么,应用程序冻结的原因是什么呢

以下是截图:

应用程序屏幕截图

当应用程序冻结时

如果我最小化和最大化窗口

调用DocumentListener.insertUpdate(DocumentEvent)时,我正在调用JTextField.modelToView(pos)


激发DocumentEvent时文档尚未完全更新。将您的代码包装到DocumentListener中的
SwingUtilities.invokeLater(…)
。这将导致在文档完成自身更新后执行事件代码。

请考虑提供一个示例来说明您的问题。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将导致更少的混乱和更好的响应。让我看看,如果我能用一小段代码重现这个问题!“我相信在EDT中会发生这种情况”这可以通过打印布尔方法
EventQueue.isDispatchThread()
是的,每次都是这样。我已经创建了代码的小快照,但它没有再现问题。我现在该怎么办?好的,让我试试。但是,我在某个地方读到,这些方法是在文档更新后启动的!这不是一直都是真的吗?