0

Я испытываю неустойчивую проблему с классом, который расширяет javax.swing.text.DefaultStyledDocument. Этот документ отправляется на принтер. В большинстве случаев форматирование документа выглядит правильно, но время от времени это не так. Похоже, что некоторые изменения в форматировании не были применены.DefaultStyledDocument.styleChanged (стиль стиля) может не запускаться своевременно?

Я посмотрел на 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), значит, что я не могу рассчитывать на мои изменения форматирования, фигурирующих в документе, прежде чем он оказана?

Если это так, есть ли способ обеспечить, чтобы я не выполнял рендеринг до тех пор, пока обновления не произойдут?

ответ

2

В конце кода вы видите fireChangedUpdate(dde);. Попробуйте добавить себя как DocumentListener. Внутри метода DocumentListener.changedUpdate вы должны сохранить, чтобы распечатать документ со всеми внесенными изменениями.

1

У меня была схожая проблема.

Чтобы решить, я запускаю после того, как задал что-то в качающемся тексте, пустой invokeLater, и когда этот invokeLater будет завершен, я надеюсь, что текст swing будет вызываться позже.

Мой код, возможно, лучше, чем мой английский:

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

Это horribel, но это работа, извините.