如何查找生成DocumentEvent的源组件

时间:2011-03-07 10:49:38

标签: java swing properties document jtextfield

是否有可能发现哪个项目生成了DocumentEvent?像我可以用ActionListener做的事情:

JTextField field = new JTextField("");
field.addActionListener(actionListener);

//inside ActionListener
public void actionPerformed(ActionEvent arg0) {
  if (arg0.getSource() instanceof JTextField) //true

}

我想对DocumentEvent做同样的事情,但似乎不会以同样的方式工作:

JTextField field = new JTextField("");
field.getDocument.addDocumentListener(documentListener);
//inside documentListener
public void insertUpdate(DocumentEvent){
  if (arg0.getSource() instanceof JTextField) //false: class is javax.swing.text.PlainDocument
  if (arg0.getSource() instanceof MyComponent){
      MyComponent comp = (MyComponent)arg0.getSource();
      comp.callSpecificMethodUponMyComp(); 
  }
}

答案者应该考虑以下几点:

  1. 为了我的目的,知道生成事件的对象类型是不够的,但我需要在运行时引用它。
  2. 通常,事件是从swing对象的扩展(myComp public JTextField)生成的。这些对象存储应在运行时在侦听器方法(例如,插入更新)
  3. 内检索的其他信息
  4. DocumentListener是从一个不知道生成事件的字段的类实现的。不同类型的差异字段可以在运行时附加到侦听器。

3 个答案:

答案 0 :(得分:28)

您可以在文档中设置属性,以告诉您文档属于哪个textcomponent:

例如:

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);

<强>替代地

获取源自该事件的文档,并将其与文本字段的文档进行比较。

示例:

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");
    }
}

答案 1 :(得分:3)

而不是将多个字段添加到同一个侦听器。创建一个自定义侦听器,在创建时接受对文本字段的引用。然后在每次将其添加到字段时创建一个新的侦听器实例。

答案 2 :(得分:0)

具有document属性的尝试等同于独立

Map<javax.swing.text.Document, javax.swing.JTextField> textFields;

建议的侦听器扩展名可能是

public void bind(JTextField tf)
{
    final Document doc = tf.getDocument();
    textfields.put(doc, tf);
    doc.addDocumentListener(this);
}