有一个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。
还是一样的错误希望有解决方法的大侠进来讨论讨论,我在感激之余一定不忘给分!^_^
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。
还是一样的错误希望有解决方法的大侠进来讨论讨论,我在感激之余一定不忘给分!^_^
应该是text1.setText("got the example")而不是
text1.setText(0,"got the example",null);
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方法的参数错了吧,楼上的说的也对
String str,
AttributeSet a)
String str,
AttributeSet a)
那个参数是打错了
真正的问题不在这里,而是setText这个方法
我查过一些资料都说在任何情况下调用setText都是线程安全的,但是在这里就是抛出异常
真不明白
高人路过的话,给我留个话,可以解决问题的,这100分就是你的了
我理解楼主的意思是如果用户输入了example就自动给替换成got the example如果是这样的话,这段代码可以实现:添加KeyListener
public void keyTyped(KeyEvent arg0) {
if (textField.getText().equals("exampl") && arg0.getKeyChar() == 'e') {
textField.setText("got the exampl");
}
}
非常感谢你的方法,这已经解决了大部分问题,但是如果用户是用鼠标右键粘贴输入呢?
其实我目前在搞一个ftp客户端,大部分工作已经完成。
只剩一个用户输入界面。
这个界面我设置了四个文本筐,第一个用来输入ip,如果用户粘贴进来的ip地址格式是
ftp://user:[email protected]:21 这样的,就自动分析出ip,port,等。在看到你的回复之前我想到了一个比较笨的方法,就是将原来的text1组件的引用指向一个新的text组件,原来的remove掉,重新将text1 add到容器里,用是可以用,但是不完美。