代码之家  ›  专栏  ›  技术社区  ›  Sunil Kumar Sahoo

Java.Lang.ILLaltStaseExtExt在使用TejTaReA、Java中的文档侦听器时使用

  •  9
  • Sunil Kumar Sahoo  · 技术社区  · 14 年前
    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);
    

    在本例中,我在文本区域中设置文本时发现以下错误。我不知道怎么解决。

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

    我认为问题是在文档中设置文本或在文档侦听器中设置文档。但我不知道怎么解决这个问题。请帮我解决这个问题。

    2 回复  |  直到 10 年前
        1
  •  10
  •   Chadwick    14 年前

    不能在文档侦听器中修改文档。改为编写自定义文档,该文档重写insertString()或remove()方法。

    从Java教程: How to write a DocumentListener

    文档监听器不应该修改文档的内容;在通知监听器更改时,更改已经完成。相反,编写一个自定义文档来重写insertstring或remove方法,或者两者都重写。见 Listening for Changes on a Document 详细情况。

        2
  •  3
  •   Derek    10 年前

    如果您想在监听器中进行变异,可以稍后使用swingutilities.invokelater启动一个单独的线程。 小心,因为来自单独线程的修改将再次调用侦听器,因此在启动线程之前设置一个布尔值,如果设置了该值,则立即从侦听器返回,并在单独线程中完成修改后重置该值。