2010-05-07 5 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); 

In questo caso ho trovato il seguente errore durante testo impostato in textarea. Non so come risolvere.java.lang.IllegalStateException durante l'utilizzo di Document Listener in TextArea, Java

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

Penso che il problema sia impostare il testo nel documento o impostare il documento nel listener del documento. Ma non so come risolvere questo. Per favore aiutami a risolvere questo problema.

risposta

9

Non è possibile modificare il documento all'interno di DocumentListener. Scrivi invece un documento personalizzato, che sovrascrive i metodi insertString() o remove().

da Java Tutorial: How to write a DocumentListener

ascoltatori documento non dovrebbe modificare i contenuti del documento; La modifica è già completata dal momento in cui il listener viene informato della modifica. Invece, scrivi un documento personalizzato che sovrascrive insertString o rimuovi metodi, o entrambi. Vedi Listening for Changes on a Document per i dettagli.

3

Se si desidera mutare nel listener, è possibile avviare un thread separato per farlo in seguito con SwingUtilities.invokeLater. Fai attenzione perché le modifiche dal thread separato chiameranno di nuovo il listener, quindi imposta un valore booleano prima di avviare il thread, torna immediatamente dal listener se è impostato e lo ripristina dopo che le modifiche sono state fatte nel thread separato.

Problemi correlati