[IllegalStateException: попытка изменения в уведомлении]

Я хочу создать documentListener, если я введу JTextField : txt_ip4class и сопоставлю регулярное выражение формата IPv4, это изменит содержимое JComboBox : box_ip4class.

Если содержимое изменено (itemStateChanged), диапазон класса IP будет записан до JTextField : txt_rangeclass, использование битов и будет записано до `JTextField : txt_bitclass``*.

Я преуспел в этом методе, но с помощью классического метода (с использованием jButton), но я потерпел неудачу в этом методе с использованием documentListener. Изменилось только JComboBox : box_ip4Class.

Мой код, применяющий documentListener к txt_ip4class:

txt_ip4class.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void insertUpdate(DocumentEvent e) {
        logUpdate();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        logUpdate();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        logUpdate();
    }

    void logUpdate() {
        Runnable doHighlight = new Runnable() {
                @Override
                public void run() {
                    String aTxt = txt_ip4class.getText();
                    classValue = 1;
                    if (!aTxt.matches("\\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4}\\b")) {
                        classValue = 0;
                    } else if (aTxt.matches("\\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4}\\b")) {
                        try {
                            classW.classMain(classValue, box_ip4class, txt_ip4class, txt_rangeclass, txt_bitclass);

                        } catch (IllegalStateException e) {

                        }
                    }
                }
            };
            SwingUtilities.invokeLater(doHighlight);
        }
});

classW.Main содержит два условия, если нулевое, то будут установлены другие поля на основе jComboBox (txt_ip4class будет заменено), если одно, то должно быть установлено jComboBox выбором варианта. И из этого варианта должно получиться нулевой вариант

Полный код (я экспортирую эти файлы из проекта Netbeans в zip):

  1. Успешный метод, который использует jButton для выполнения
  2. Неудачный метод, использующий documentListener без jButton

Полная трассировка стека исключений находится здесь

or

    Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338)
    at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:658)
    at javax.swing.text.JTextComponent.setText(JTextComponent.java:1669)
    at engines.ClassW.setFromCombo(ClassW.java:140)
    at interfaces.Netgui$1.logUpdate(Netgui.java:63)
    at interfaces.Netgui$1.insertUpdate(Netgui.java:41)
    at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201)
    at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748)
    at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707)
    at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130)
    at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:669)
    at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1328)
    at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:884)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2929)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
    at java.awt.Component.processEvent(Component.java:6310)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
    at java.awt.Component.dispatchEventImpl(Component.java:4760)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    BUILD SUCCESSFUL (total time: 19 seconds)

===============РЕДАКТИРОВАТЬ 1============

Благодаря @MarkRotteveel и этому сообщению

Эта проблема исправлена, но существует другая проблема. Код в doHighlight работает в цикле.

=============== РЕДАКТИРОВАТЬ 2============

Обновил код. doHighlight больше не зацикливается, когда условие не равно регулярному выражению. но все еще выполняет цикл, когда условие равно.


person Sayful Adrian    schedule 05.01.2018    source источник
comment
Пожалуйста, опубликуйте полную трассировку исключений.   -  person Mark Rotteveel    schedule 05.01.2018
comment
Добавлен @MarkRotteveel   -  person Sayful Adrian    schedule 05.01.2018
comment
Вы пытаетесь изменить документ из-за события, вызванного изменением документа. Это не разрешено. Возможно, вам следует поставить модификацию в очередь (например, используя SwingUtilities.invokeLater()). Обратите внимание, мои качели ржавые, так что я могу ошибаться.   -  person Mark Rotteveel    schedule 05.01.2018
comment
См. также: stackoverflow.com/questions/15206586 /   -  person Mark Rotteveel    schedule 05.01.2018
comment
Спасибо @MarkRotteveel, эта проблема исправлена, но возникла другая проблема, лол, пока я жду другого ответа, я тоже постараюсь исправить это.   -  person Sayful Adrian    schedule 05.01.2018