如何找到触发DocumentEvent的源控件

本文介绍在Java Swing中,如何在监听DocumentEvent时找出触发事件的源JTextField。通常,通过getSource()无法直接获取源控件,但可以通过两种方法实现:一是为每个JTextField的document设置特定属性;二是比较事件document与所有JTextfield的document。文中提供了具体的代码示例,以根据需求选择合适的方法进行事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

监听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 ;

    ​     }

    ​}

}


本文参考http://stackoverflow.com/questions/5218731/how-to-find-source-component-that-generated-a-documentevent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值