DefaultStyledDocument.styleChanged(Стиль стиля) может не выполняться своевременно?
Я испытываю периодическую проблему с классом, который расширяется 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)
значит, я не могу рассчитывать на изменения форматирования, которые появляются в документе до его визуализации?
Если это так, есть ли способ гарантировать, что я не продолжу рендеринг, пока не произойдут обновления?
2 ответа
Вы видите fireChangedUpdate(dde);
в конце кода. Попробуйте добавить себя в качестве DocumentListener
, Внутри DocumentListener.changedUpdate
Метод, который вы должны сохранить, чтобы распечатать документ со всеми изменениями.
У меня была похожая проблема.
Для разрешения я запускаю после установки что-то в тексте свинга, пустой invokeLater, и когда этот invokeLater будет завершен, я надеюсь, что вызов текста свинга будет выполнен позже.
Мой код, возможно, лучше, чем мой английский:
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.
}
});
Это ужасно, но это работа, извините.