一千萬個為什麽

搜索

DefaultStyledDocument.styleChanged(樣式樣式)可能無法及時運行?

我遇到了一個延遲 javax.swing.text.DefaultStyledDocument 的類的間歇性問題。該文檔正被發送到打印機。大多數情況下,文檔的格式看起來是正確的,但偶爾也沒有。看起來格式化中的某些更改尚未應用。

我看了一下 DefaultStyledDocument.styleChanged(樣式樣式)代碼:

/**
 * 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 方法中,您應該保存以打印包含所有更改的文檔。

轉載註明原文: DefaultStyledDocument.styleChanged(樣式樣式)可能無法及時運行?