java.lang.IllegalStateException при использовании прослушивателя документов в TextArea, Java
DocumentListener dl = new MessageDocumentListener();
((AbstractDocument) nboxArea.getDocument()).setDocumentFilter(new DocumentFilter() {
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
string = string.replaceAll("\t", "");
super.insertString(fb, offset, string,(javax.swing.text.AttributeSet) attr);
}
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
text = text.replaceAll("\t", "");
//TODO must do something here
super.replace(fb, offset, length, text,(javax.swing.text.AttributeSet) attrs);
}
});
JTextArea evArea = (JTextArea) c;
evArea.getDocument().removeDocumentListener(dl);
evArea.setText(originalMessage);
В этом случае я обнаружил следующую ошибку во время установки текста в textarea. Я не знаю, как решить.
Exception in thread "AWT-EventQueue-0"
java.lang.IllegalStateException: Attempt to mutate in notification
Я думаю, что проблема заключается в том, чтобы установить текст в документе или настройку документа в слушателе документа. Но я не знаю, как это решить. Пожалуйста, помогите мне решить эту проблему.
2 ответа
Вы не можете изменить документ внутри DocumentListener. Вместо этого напишите собственный документ, который переопределяет методы insertString() или remove().
Из Учебников Java: Как написать DocumentListener
Слушатели документа не должны изменять содержимое документа; Изменение уже завершено к тому времени, когда слушатель уведомлен об изменении. Вместо этого напишите пользовательский документ, который переопределяет методы insertString, remove или оба. См. Прослушивание изменений в документе для получения подробной информации.
Если вы хотите мутировать в слушателе, вы можете запустить отдельный поток, чтобы сделать это позже с SwingUtilities.invokeLater. Будьте осторожны, потому что изменения из отдельного потока снова вызовут прослушиватель, поэтому установите логическое значение перед запуском потока, немедленно вернитесь из прослушивателя, если он установлен, и сбросьте его после того, как изменения были выполнены в отдельном потоке.