是否有可能发现哪个项目生成了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();
}
}
答案者应该考虑以下几点:
答案 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);
}