DefaultStyledDocument.styleChanged (Стиль стиля) может не выполняться своевременно? - PullRequest
0 голосов
/ 07 мая 2010

У меня периодически возникает проблема с классом, который расширяет 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();
    }
}
}

Означает ли тот факт, что вместо invokeAndWait(updateRunnable) вызывается SwingUtilities.invokeLater(updateRunnable), я не могу рассчитывать на мои изменения форматирования, появляющиеся в документе до его визуализации?

Если это так, есть ли способ гарантировать, что я не продолжу рендеринг, пока не произойдут обновления?

Ответы [ 2 ]

2 голосов
/ 10 мая 2010

Вы видите fireChangedUpdate(dde); в конце кода. Попробуйте добавить себя как DocumentListener. В методе DocumentListener.changedUpdate вы должны быть сохранены, чтобы распечатать документ со всеми изменениями.

1 голос
/ 07 мая 2010

У меня была похожая проблема.

Для разрешения я запускаю после установки что-то в тексте свинга, пустой 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.
  }
});

Это ужасно, но это работает, извините.

...