Question

Je rencontre un problème intermittent avec une classe qui étend javax.swing.text.DefaultStyledDocument. Ce document est envoyé à une imprimante. La plupart du temps la mise en forme du document semble correct, mais une fois dans un certain temps, il ne fonctionne pas. On dirait que certains des changements dans la mise en forme n'ont pas été appliquées.

Je pris un coup d'oeil au code 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();
    }
}
}

Le fait que SwingUtilities.invokeLater(updateRunnable) est appelée, plutôt que invokeAndWait(updateRunnable), signifie que je ne peux pas compter sur mes modifications de mise en forme apparaissant dans le document avant qu'il ne soit rendu?

Si tel est le cas, est-il un moyen de faire en sorte que je ne procède pas à rendre jusqu'à ce que les mises à jour se sont produits?

Était-ce utile?

La solution

Vous voyez un fireChangedUpdate(dde); à la fin du code. Essayez de vous ajouter comme DocumentListener. Dans la méthode de DocumentListener.changedUpdate vous devriez être sauver d'imprimer votre document avec tous les changements inclus.

Autres conseils

J'ai eu le même problème.

Pour resolv, je lance après quelque chose ensemble dans un texte de swing, un invokeLater vide, et quand ce invokeLater est fait, j'espère que le texte swing Invoke est fait plus tard.

Mon code est peut-être mieux que mon anglais:

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

de horribel, mais le travail est tout, désolé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top