有一个JTextField实例text1,这样给他添加一个监听
text1.getDocument().addDocumentListener(new DocumentListener(){
...
public  void insertUpdate(DocumentEvent e) {
if(text1.getText().equals("example")){
  
text1.setText(0,"got the example",null);
 
}
 } }
);当在text1里面输入“example'时候,程序调用text1.setText(0,"got the example",null);
然后抛出
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1343)
at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:662)
at javax.swing.text.JTextComponent.setText(JTextComponent.java:1441)
at dialog$1.insertUpdate(dialog.java:111)
...
...
..等等我怀疑JTextField在相应用户输入的时候不可以setText,但是我把焦点先移到别处再调用setText。
还是一样的错误希望有解决方法的大侠进来讨论讨论,我在感激之余一定不忘给分!^_^

解决方案 »

  1.   

    setText方法打错了
    应该是text1.setText("got the example")而不是
    text1.setText(0,"got the example",null);
      

  2.   

    setText
    public void setText(String t)
    Sets the text that is presented by this text component to be the specified text. Overrides:
    setText in class TextComponent
    Parameters:
    t - the new text.
    以上是帮助文档内容,你的setText方法的参数错了吧,楼上的说的也对
      

  3.   

    对,楼主应该想查看一下JDK文档
      

  4.   

    insertString(int offset,
                      String str,
                      AttributeSet a)
      

  5.   

    document.insertString(int offset,
                      String str,
                      AttributeSet a)
      

  6.   

    二楼就是我,也就是楼主
    那个参数是打错了 
    真正的问题不在这里,而是setText这个方法
    我查过一些资料都说在任何情况下调用setText都是线程安全的,但是在这里就是抛出异常
    真不明白
    高人路过的话,给我留个话,可以解决问题的,这100分就是你的了
      

  7.   

    出错原因可能是由于JTextField的setText()方法会导致一个异常,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常。若不处理它,可能就会报错!楼主不妨加上异常处理再试一试
      

  8.   

    setText的时候没有得到writeLock,因为insertUpdate已经有一个writelock。
    我理解楼主的意思是如果用户输入了example就自动给替换成got the example如果是这样的话,这段代码可以实现:添加KeyListener
     public void keyTyped(KeyEvent arg0) {
                    if (textField.getText().equals("exampl") && arg0.getKeyChar() == 'e') {
                        textField.setText("got the exampl");
                    }
                }
      

  9.   

    cheng_fu(扬风太阳雨) 
    非常感谢你的方法,这已经解决了大部分问题,但是如果用户是用鼠标右键粘贴输入呢?
    其实我目前在搞一个ftp客户端,大部分工作已经完成。
    只剩一个用户输入界面。
    这个界面我设置了四个文本筐,第一个用来输入ip,如果用户粘贴进来的ip地址格式是
    ftp://user:[email protected]:21 这样的,就自动分析出ip,port,等。在看到你的回复之前我想到了一个比较笨的方法,就是将原来的text1组件的引用指向一个新的text组件,原来的remove掉,重新将text1 add到容器里,用是可以用,但是不完美。