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

时间:2015-04-05 03:25:53

标签: java swing deadlock freeze

我正在用Java创建一个Transliterating工具。它几乎完成了。 但是,当我输入如此之快时,GUI会冻结。

因此,我调试了应用程序以查明命令发生的位置。

对方法JTextField.modelToView(pos)的调用会导致此问题,进一步调用TextUI.modelToView(JTextComponent c, int pos)

看来,此方法首先通过调用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中改变它。此外,我在调用JTextField.modelToView(pos)时调用DocumentListener.insertUpdate(DocumentEvent)

然后,原因是什么,应用程序冻结了!

以下是截图:

应用程序截图 enter image description here

当应用程序冻结时 enter image description here

如果我最小化并最大化窗口 enter image description here

1 个答案:

答案 0 :(得分:2)

  

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

触发DocumentEvent时,文档尚未完全更新。将代码包装在SwingUtilities.invokeLater(...)的DocumentListener中。这应该导致您的事件代码在Document完成更新后执行。