10 Stimmen

java.lang.IllegalStateException bei Verwendung von Document Listener in 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);

In diesem Fall habe ich den folgenden Fehler beim Setzen von Text in Textarea gefunden. Ich weiß nicht, wie ich ihn beheben kann.

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

Ich denke, dass das Problem darin besteht, den Text im Dokument oder das Dokument im Dokumentlistener zu setzen. Aber ich weiß nicht, wie ich dieses Problem lösen kann. Bitte helfen Sie mir, dieses Problem zu lösen.

10voto

Chadwick Punkte 12304

Sie können das Dokument innerhalb des DocumentListeners nicht ändern. Schreiben Sie stattdessen ein eigenes Dokument, das die Methoden insertString() oder remove() außer Kraft setzt.

Aus Java-Tutorials: Wie man einen DocumentListener schreibt

Dokument-Listener sollten den Inhalt des Dokuments nicht ändern; die Änderung ist bereits abgeschlossen, wenn der Listener über die Änderung informiert wird. Schreiben Sie stattdessen ein eigenes Dokument, das die Methoden insertString oder remove oder beide überschreibt. Siehe Abhören von Änderungen in einem Dokument für Details.

4voto

Derek Punkte 41

Wenn Sie im Listener mutieren möchten, können Sie einen separaten Thread starten, um dies später mit SwingUtilities.invokeLater zu tun. Seien Sie vorsichtig, denn die Änderungen aus dem separaten Thread rufen den Listener erneut auf. Setzen Sie also einen Booleschen Wert, bevor Sie den Thread starten, kehren Sie sofort vom Listener zurück, wenn er gesetzt ist, und setzen Sie ihn zurück, nachdem die Änderungen im separaten Thread durchgeführt wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X