## Cómo escribir un Oyente de Document

Un componente de texto Swing usa un Document para contener y editar un texto. Los eventos Document ocurren cuando el contenido de un documento cambia de alguna forma. Se le añade el oyente de Document al documento del componente, en vez de al propio componente.

#### Métodos de Evento Document

> El interface DocumentListener contiene estos tres métodos:
> void changedUpdate(DocumentEvent)
>   Se le llama cuando se modifica el estilo o algo del texto. Este tipo de eventos sólo se generan desde un StyledDocument-- un PlainDocument no genera este tipo de eventos.

> void insertUpdate(DocumentEvent)
>   Se le llama cuando se inserta texto en el documento escuchado.

> void removeUpdate(DocumentEvent)
>   Se le llama cuando se elimina texto del documento escuchado.

#### Ejemplos de Manejo de Eventos Document

> Dos ejemplos descritos en otras secciones tienen oyentes de document:
> - El descrito en Escuchar los Cambios en un Documento actualiza un diario de cambios cada vez que cambia el texto del documento. El código fuente del ejemplo está en TextComponentDemo.java.
> - Y el descrito en Usar un Oyente de Document en un Text Field actualiza un valor numérico basado en otros valores introducidos en campos de texto por el usuario. Puedes encontrar el código fuente en TextFieldDemo.java.
> Ambas sección hacen un importante apunte que merece la pena repetir aquí:

> > Nunca debemos modificar el contenido de un documento desde dentro de un oyente de document. El programa se podría quedar bloqueado. Para evitarlo, podemos usar un documento personalizado para el componente de texto.

#### El interface DocumentEvent

> Cada método de evento document tiene un sólo parámetros, un ejemplar de una clase que implemente el interface DocumentEvent. Típicamente, el objeto pasado a este método será un ejemplar de DefaultDocumentEvent que está definido en AbstractDocument.

> Para obener el documento que generó el evento, podemos usar el método getDocument de DocumentEvent. Observa que DocumentEvent no desciende de EventObject como las otras clases de eventos. Por lo tanto, no hereda el método getSource.

> Además de getDocument, la clase DocumentEvent proporciona otros tres métodos:

> int getLength()
>   Devuelve la longitud del cambio.
> int getOffset()
>   Devuelve la posición dentro del documento del primer caracter modificado.
> ElementChange getChange(Element)
>   Devuelve detalles sobre qué elementos del documento han cambiado y cómo. ElementChange es un interface definido dentro del interface DocumentEvent.
> EventType getType()
>   Devuelve el tipo de cambio que ha ocurrido. EventType es una clase definida dentro del interface DocumentEvent que enumera los posibles cambios que pueden ocurrir en un document: insertar y eliminar texto y cambiar el estilo.

Ozito