如何查找生成DocumentEvent的源组件

是否有可能发现哪个项目生成了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)生成的。 这些对象存储应在运行时在侦听器方法内检索的其他信息(例如,insertUpdate)
  3. DocumentListener是从一个不知道生成事件的字段的类实现的。 不同类型的差异字段可以在运行时附加到侦听器。

您可以在文档中设置属性以告诉您文档属于哪个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"); } } 

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