java.lang.IllegalStateException при использовании Document Listener в TextArea, Java - PullRequest
9 голосов
/ 07 мая 2010
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 ]

10 голосов
/ 07 мая 2010

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

Из руководств по Java: Как написать DocumentListener

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

3 голосов
/ 08 октября 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...