2011-03-07 8 views
14

¿Es posible descubrir qué objeto generado generó un DocumentEvent? Algo así como lo que puedo hacer con ActionListener:cómo encontrar el componente fuente que generó un DocumentEvent

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

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

} 

me gustaría hacer lo mismo con DocumentEvent pero parece que no funciona de la misma manera:

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

El answser debe tomar en consideración los siguientes puntos:

  1. Para mis propósitos, conocer el tipo de objeto que generó el evento no es suficiente, pero necesito una referencia en tiempo de ejecución.
  2. Normalmente, los eventos se generan a partir de la extensión del objeto swing (myComp public JTextField). Estos objetos almacenan información adicional que debe recuperarse en tiempo de ejecución dentro del método listener (es. InsertUpdate)
  3. DocumentListener se implementa desde una clase que desconoce los campos que generaron los eventos. Diferentes campos de diferentes tipos pueden ser atacados al oyente en tiempo de ejecución.

Respuesta

26

Puede establecer una propiedad en el documento que le diga qué TextComponent el documento pertenece a:

Por ejemplo:

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

Alternativamente:

Obtener el documento que originó el evento y lo compara con el documento del campo de texto.

Ejemplo:

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

Gracias por su respuesta. Muy útil, pero no es suficiente para mi diseño. Edité mi pregunta tratando de explicar mejor cuáles son mis necesidades – Heisenbug

+2

La primera versión de esta respuesta, que establece una propiedad de 'propietario', parece encajar perfectamente con la pregunta (por cierto, ¡no sabía nada de eso!). ¿Puede explicar más específicamente por qué esto no satisface sus necesidades? –

+0

@Jesse Barnum: creo que tienes razón. En realidad, he entendido mal primera respuesta dogbane que fue perfecto. De hecho, si quiero tener una referencia directa al tipo MyComponent, puedo hacer algo como field.putProperty ("MyComponent", anInstanceOfMyComponent), ¿verdad? (Me siento un poco estúpido ahora :(, tal vez las líneas de código de estos días me hicieron confundir) – Heisenbug

3

En lugar de añadir varios campos a la misma escucha. Cree un oyente personalizado que al crearse haga referencia al campo de texto. Luego, cree una nueva instancia del oyente cada vez que la agregue a un campo.

+0

sí ... puede ser una buena solución, gracias. Pero mis oyentes son muchos y son objetos bastante grandes .. tener múltiples instancias de puede que no sea una buena idea. – Heisenbug

+0

Puede dividir a sus oyentes en su propia clase que hace llamadas al objeto grande. – jzd

Cuestiones relacionadas