监听JTextField控件里文本的修改需要用到DocumentListenner。
不像ActionListener等监听器可以用getSource()直接找到触发Event的源控件(如下面的代码),DocumentListener需要其他方法才能找到。
public void itemStateChanged(ItemEvent arg0) {
……
List selectedList = (List)arg0.getSource();//Get the changed list
……
}
找到触发DocumentEvent的源控件的方法如下:
方法一:为控件的document设置一个property(自定义一个名值对,名字随便起,而值则为控件本身)来进行标记。通过比较这个property来判断出哪一个是触发事件的源控件。示例如下
final JTextField field = new JTextField("");field.getDocument().putProperty("owner", field); //set the owner
final JTextField field2 = new JTextField("");field2.getDocument().putProperty("owner", field2); //set the owner
DocumentListener documentListener = new DocumentListener() {
public void changedUpdate(DocumentEvent documentEvent) {}
public void insertUpdate(DocumentEvent documentEvent) {
//get the owner of this document
Object owner = documentEvent.getDocument().getProperty("owner");
if(owner != null){
//owner is the jtextfield
System.out.println(owner);
}
}
public void removeUpdate(DocumentEvent documentEvent) {}
private void updateValue(DocumentEvent documentEvent) {}};field.getDocument().addDocumentListener(documentListener);field2.getDocument().addDocumentListener(documentListener);
方法二、获取事件的源document,然后与各个JTextfield的document比较来获得源控件(JTextfield)示例如下
public void insertUpdate(DocumentEvent documentEvent) {
if (documentEvent.getDocument()== field.getDocument()){
System.out.println("event caused by field");
}
else if (documentEvent.getDocument()== field2.getDocument()){
System.out.println("event caused by field2");
}}
总结:
第一种方法可以像ActionListenner那样直接获取到源控件并进行赋值,非常方便就可以获取到源控件。
第二种方法不用额外为各个控件设定property,减少了一定的工作量。但是第二种方法只能通过进行比较来获取源控件的,并没有办法直接将源控件进行赋值。
如果对各个控件的事件处理不同,那么建议用方法二;如果对各个控件的事件处理方法相同,那么方法一是更省事一些的。
下面是自己写的代码,因为要对不同的源控件进行单独处理,故使用方法二
private class TextfieldModified implements DocumentListener{
@Override
public void removeUpdate(DocumentEvent arg0) {
saveChangedText(arg0);
}
@Override
public void insertUpdate(DocumentEvent arg0) {
saveChangedText(arg0);
}
@Override
public void changedUpdate(DocumentEvent arg0) {
saveChangedText(arg0);
}
private void saveChangedText(DocumentEvent arg0){
……
Document tempDoc = arg0.getDocument();
if(tempDoc == startTimeTxt.getDocument()){
……
}
else if(tempDoc == endTimeTxt.getDocument()){
……
}
else if(tempDoc == leftTxt.getDocument()){
……
}
else if(tempDoc == topTxt.getDocument()){
……
}
else if(tempDoc == widthTxt.getDocument()){
……
}
else if(tempDoc == heightTxt.getDocument()){
……
}
else{
return ;
}
}
}