下面是我的部分代码
JTextArea area = new JTextArea();
area.addCaretListener(new CaretListener(){ public void caretUpdate(CaretEvent e) {
if(e.getDot() != 0){ System.out.println(area.getText());
area.setText("");
} }});
我想在获取到文本后就将JTextArea清空,用area.setText("");应该是没问题的啊,可是会出现下面的异常
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification请大家指点一下,谢过了

解决方案 »

  1.   

    你这样想
    caretUpdate的触发条件是 当插入符的位置被更新时调用
    那么你第一次输入数的时候,插入符位置被更新,那么方法调用,就会将文本设置为空,那么插入符位置又改变了,又会调用该方法,所以才会抛出非法状态异常。所以用这个方法来做不是很恰当,可以换个监听器,当输入完文本后按键盘(KeyEvent)或者点鼠标(MouseEvent)后再将文本域清空。还有,你觉得当你在文本框里输入东西后什么都没做却又马上又消失了,那么输入还有意义吗?
      

  2.   

    因为我这个文本框是要不断接受到内容的,然后我要对接受到的内容进行处理,System.out.println(area.getText());只是我试验程序用的,实际上我要做别的处理。所以我想在获取到文本后就把它清空,等待再次接受数据,再做处理。如此往复。这段程序运行起来将自行运行,所以用类似点鼠标的事件是不可能的,能再给指点一下吗?
      

  3.   

    获取到文本就要清空?那你还要它做什么。你试试睡上几百个毫秒
    在System.out.println前面加
    Thread.sleep(300);
    试试,看还报异常么。你的需求让我蛋疼。
      

  4.   

    把那句清空的话放到一个线程里就可以了,可以用
    SwingUtils.invokeLater(new Runnable(){
     public void run(){
       area.setText("");
     }
    });你试试
      

  5.   

    是这样的,我是要area.getText()然后进行,处理,处理完成后就要清空文本,这样下次我再调用area.getText()又会获取新的文本而不是新的加旧的,就是这个需求,谢谢你啊,你说的我试试
    给网址的朋友也谢了,我会看的
      

  6.   

    我的想法不要监听插入符位置,只用最常用的动作监听器就好,当触发监听事件之后判断文本框中的是否为空。我想应该能有效果吧。如果你就是想测试caretUpdate,忽略本条