我正在用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)
。
然后,原因是什么,应用程序冻结了!
以下是截图:
应用程序截图
当应用程序冻结时
如果我最小化并最大化窗口
答案 0 :(得分:2)
当调用DocumentListener.insertUpdate(DocumentEvent)时,我正在调用JTextField.modelToView(pos)。
触发DocumentEvent时,文档尚未完全更新。将代码包装在SwingUtilities.invokeLater(...)
的DocumentListener中。这应该导致您的事件代码在Document完成更新后执行。