Código Java – Evento de Cambio de Texto en JTextField

Este es el Ejemplo #07 del Topic: Programación Gráfica en Java.

Generalmente las IDE’s de desarrollo en Java no traen incluidos el evento de cambio de texto en las cajas de entrada, por lo menos los que he usado no los tienen, ni Netbeans que es mi preferida tampoco lo trae, debido a eso para lograr tal efecto vamos a implementar una función JTexFieldChanged haciendo uso de DocumentEvent y DocumentListener del que derivarán los eventos deseados:

...
    private void setJTexFieldChanged(JTextField txt)
    {
        DocumentListener documentListener = new DocumentListener() {

        @Override
        public void changedUpdate(DocumentEvent documentEvent) {
            printIt(documentEvent);
        }

        @Override
        public void insertUpdate(DocumentEvent documentEvent) {
            printIt(documentEvent);
        }

        @Override
        public void removeUpdate(DocumentEvent documentEvent) {
            printIt(documentEvent);
        }
        };
        txt.getDocument().addDocumentListener(documentListener);

    }

    private void printIt(DocumentEvent documentEvent) {
        DocumentEvent.EventType type = documentEvent.getType();

        if (type.equals(DocumentEvent.EventType.CHANGE))
        {

        }
        else if (type.equals(DocumentEvent.EventType.INSERT))
        {
           //Método a ejecutar
        }
        else if (type.equals(DocumentEvent.EventType.REMOVE))
        {
            //Método a ejecutar
        }
    }
...

Código de Ejemplo:

package beastieux.gui;

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

/**
 *
 * @author beastieux
 */
public class Ejm07_EventoTextFieldChanged extends JFrame{

    private JTextField txtEjemplo;
    private JLabel lblEjemplo;

    public Ejm07_EventoTextFieldChanged()
    {
        txtEjemplo=new JTextField();
        lblEjemplo=new JLabel();
        this.add(txtEjemplo);
        this.add(lblEjemplo);
        this.setLayout(new GridLayout(1,1));
        this.setSize(400, 80);

        setJTexFieldChanged(txtEjemplo);
    }

    private void setJTexFieldChanged(JTextField txt)
    {
        DocumentListener documentListener = new DocumentListener() {

        @Override
        public void changedUpdate(DocumentEvent documentEvent) {
            printIt(documentEvent);
        }

        @Override
        public void insertUpdate(DocumentEvent documentEvent) {
            printIt(documentEvent);
        }

        @Override
        public void removeUpdate(DocumentEvent documentEvent) {
            printIt(documentEvent);
        }
        };
        txt.getDocument().addDocumentListener(documentListener);

    }

    private void printIt(DocumentEvent documentEvent) {
        DocumentEvent.EventType type = documentEvent.getType();

        if (type.equals(DocumentEvent.EventType.CHANGE))
        {

        }
        else if (type.equals(DocumentEvent.EventType.INSERT))
        {
            txtEjemploJTextFieldChanged();
        }
        else if (type.equals(DocumentEvent.EventType.REMOVE))
        {
            txtEjemploJTextFieldChanged();
        }
    }

    private void txtEjemploJTextFieldChanged()
    {
        //Copiar el contenido del jtextfield al jlabel
        this.lblEjemplo.setText(this.txtEjemplo.getText());
    }

    public static void main(String args[]) {
        Ejm07_EventoTextFieldChanged obj = new Ejm07_EventoTextFieldChanged();
        obj.setVisible(true);
    }
}

Pueder ir al artículo principal:

Códigos Sencillos hechos en Java

9 thoughts on “Código Java – Evento de Cambio de Texto en JTextField

  1. Hola Muchachis, despues de varias horas de busqueda para encontrar una forma practica y poco boluminosa para detectar el cambio de texto en un jLabel (java) me encontre con la ultima citacion de un colega en la Web: http://www.coderanch.com/t/346037/GUI/java/detect-change.
    El codigo es mas o menos asi:

    jLabel_1.addPropertyChangeListener(“text”, new PropertyChangeListener() {
    //Donde “text” no es mas que un parametro, no está referido al texto del jLabel.

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
    //Codiogo necesario.
    }
    });

    En mi caso particular, lo plantee de la siguiente forma:
    jLabel_1.addPropertyChangeListener(“text”, new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
    if(bandera == false){
    bandera = true;
    jLabel_1.setText( jLabel_.getText() + ” Texto que deseo agregar ” );
    }
    else
    bandera = false;
    }
    });
    Explicacion:
    Debido a que es un evento, como una interrupcion, decidi utilizar una bandera para que no se genere un bucle infinito de deteccion de cambio de texto.
    Debido a que mi objetivo fue que al detectar un cambio en el texto de jLabel, le agregase el texto deseado al final. Entonces, si por defecto la bandera es false; cuando la rutina que modifica el texto lo hace, se detona el evento, se pone en true la bandera y luego se modifica el texto del jLabel, detonandose el evento nuevamente, pero como encuentra a la bandera en true, solo la pone en false y se termina el bucle.

    Saludos y espero que a alguien le sirva!

  2. Yo tengo mas de un JtextField … como podria detectar si uso la funcion con mas de un jTextField como se cual JTextFiel se cambio el contenido

    POr ejemplo

    setJTexFieldChanged(txtCodigo);
    setJTexFieldChanged(txtNombre);
    setJTexFieldChanged(txtDescripcion);

    COmo se cual es el que cambio

  3. Supongamos que ya le puse el DocumentListener pero ahora surge la necesidad de remover tal evento al campo de texto en plena ejecución, cual sería el codiogo para remover?…. alguíen me puede ayudar… gracias

Deja un comentario