DefaultStyledDocument.stylechanged (نمط النمط) قد لا يعمل في الوقت المناسب؟
-
03-10-2019 - |
سؤال
أواجه مشكلة متقطعة مع فصل يمتد 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();
}
}
}
هل حقيقة أن SwingUtilities.invokeLater(updateRunnable)
يسمى ، بدلا من invokeAndWait(updateRunnable)
, ، يعني أنه لا يمكنني الاعتماد على تغييرات التنسيق التي تظهر في المستند قبل تقديمها؟
إذا كان هذا هو الحال ، هل هناك طريقة للتأكد من أنني لا أتابع التقديم حتى تحدث التحديثات؟
المحلول
ترى أ fireChangedUpdate(dde);
في نهاية الكود. حاول إلحاق نفسك ك DocumentListener
. داخل DocumentListener.changedUpdate
الطريقة التي يجب أن تحفظها لطباعة المستند الخاص بك مع جميع التغييرات المدرجة.
نصائح أخرى
لقد واجهت مشكلة مماثلة.
من أجل حلها ، أقوم بتشغيل بعد تعيين شيء في نص التأرجح ، و 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.
}
});
إنه رعب ، لكنه يعمل ، آسف.