DefaultStyledDocument.Stylechanged(样式)可能不会及时运行?
-
03-10-2019 - |
题
我正在遇到一个间歇性问题,该课程扩展 javax.swing.text.DefaultStyledDocument
. 。该文档正在发送到打印机。大多数情况下,文档的格式看起来正确,但偶尔却没有。看起来格式中的某些更改尚未应用。
我看了看 DefaultStyledDocument.styleChanged(Style style)
代码:
/**
* Called when any of this document's styles have changed.
* Subclasses may wish to be intelligent about what gets damaged.
*
* @param style The Style that has changed.
*/
protected void styleChanged(Style style) {
// Only propagate change updated if have content
if (getLength() != 0) {
// lazily create a ChangeUpdateRunnable
if (updateRunnable == null) {
updateRunnable = new ChangeUpdateRunnable();
}
// We may get a whole batch of these at once, so only
// queue the runnable if it is not already pending
synchronized(updateRunnable) {
if (!updateRunnable.isPending) {
SwingUtilities.invokeLater(updateRunnable);
updateRunnable.isPending = true;
}
}
}
}
/**
* When run this creates a change event for the complete document
* and fires it.
*/
class ChangeUpdateRunnable implements Runnable {
boolean isPending = false;
public void run() {
synchronized(this) {
isPending = false;
}
try {
writeLock();
DefaultDocumentEvent dde = new DefaultDocumentEvent(0,
getLength(),
DocumentEvent.EventType.CHANGE);
dde.end();
fireChangedUpdate(dde);
} finally {
writeUnlock();
}
}
}
做事实 SwingUtilities.invokeLater(updateRunnable)
被称为,而不是 invokeAndWait(updateRunnable)
, ,意味着我不能指望在文档渲染之前出现在文档中出现的更改?
如果是这样,是否有一种方法可以确保在更新发生之前我不继续渲染?
解决方案
你看到一个 fireChangedUpdate(dde);
在代码末尾。尝试将自己作为一个 DocumentListener
. 。在 - 的里面 DocumentListener.changedUpdate
您应该保存的方法以打印文档,其中包括所有更改。
其他提示
我也有类似的问题。
为了解决,我在秋千文本,一个空的InvokeLater中设置了一些东西后启动,当完成此InstokeLater后,我希望秋千文本以后完成。
我的代码也许比我的英语更好:
doc.formatSomethingWhichPerhapsLaunchInvokeLater();
EventQueue.invokeLater(new java.lang.Runnable()
{
public void run()
{
// at this point, I hope all swing text stuff is finish.
// Until now, it's the case.
}
});
这是恐怖的,但很抱歉。
不隶属于 StackOverflow