2010-05-07 3 views
8
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. Я не знаю, как это решить.java.lang.IllegalStateException при использовании Document Listener в TextArea, Java

Exception in thread "AWT-EventQueue-0" 
java.lang.IllegalStateException: Attempt to mutate in notification 

Я думаю, что проблема заключается в установке текста в документе или установочном документе в приемнике документов. Но я не знаю, как это решить. Пожалуйста, помогите мне решить эту проблему.

ответ

9

Вы не можете изменить документ внутри DocumentListener. Вместо этого напишите собственный документ, который переопределяет методы insertString() или remove().

От Java Tutorials: How to write a DocumentListener

слушатели документа не должны изменять содержимое документа; Это изменение уже завершено к тому времени, когда слушатель будет уведомлен об этом изменении. Вместо этого напишите собственный документ, который переопределяет методы insertString или remove, или и то, и другое. См. Listening for Changes on a Document.

3

Если вы хотите мутировать в слушателе, вы можете запустить отдельный поток, чтобы сделать это позже с помощью SwingUtilities.invokeLater. Будьте осторожны, потому что изменения из отдельного потока снова вызовут прослушиватель, поэтому установите перед буфером поток, немедленно вернитесь из слушателя, если он установлен, и сбросьте его после того, как изменения были сделаны в отдельном потоке.

Смежные вопросы