DefaultStyledDocument.styleChanged (Style-Stil) kann in angemessener Zeit nicht laufen?
-
03-10-2019 - |
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?
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.