Frage

Ich erlebe ein zeitweiliges Problem mit einer Klasse, die javax.swing.text.DefaultStyledDocument erstreckt. Dieses Dokument wird an einen Drucker gesendet. Die meiste Zeit sieht die Formatierung des Dokuments korrekt, aber in einem einmal, während es funktioniert nicht. Es sieht aus wie einige der Änderungen in der Formatierung nicht angewandt wurden.

Ich habe einen Blick auf den DefaultStyledDocument.styleChanged(Style style) Code:

/**
 * 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();
    }
}
}

Ist die Tatsache, dass SwingUtilities.invokeLater(updateRunnable) genannt wird, eher als invokeAndWait(updateRunnable), bedeutet, dass ich nicht auf meinen Formatierungsänderungen erscheinen in dem Dokument zählen kann, bevor es gemacht wird?

Wenn das der Fall ist, ist es eine Möglichkeit, um sicherzustellen, dass ich gehe nicht mit Rendering, bis der Updates aufgetreten ist?

War es hilfreich?

Lösung

Sie sehen eine fireChangedUpdate(dde); am Ende des Codes. Versuchen Sie sich als DocumentListener anhängen. Im Innern der DocumentListener.changedUpdate Methode sollten Sie speichern Ihr Dokument mit allen Änderungen enthielten drucken.

Andere Tipps

Ich habe ähnliches Problem hat.

Um resolv, ich starte nach Satz etwas in einem Schaukel Text, eine leere invokeLater, und wenn diese invokeLater getan wird, ich hoffe, den Schwung Text invoke später erfolgt.

Mein Code ist vielleicht besser als mein Englisch:

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.
  }
});

Es ist horribel, aber es ist Arbeit, sorry.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top