Foros del Web » Programación para mayores de 30 ;) » Java »

Filtros en JavaSE

Estas en el tema de Filtros en JavaSE en el foro de Java en Foros del Web. Hola a todos. Ya hacia un tiempo que no pasaba por aquí :P Hoy tengo una cuestion de novato y aunque ya llevo mucho tiempo ...
  #1 (permalink)  
Antiguo 20/07/2016, 10:35
 
Fecha de Ingreso: noviembre-2015
Mensajes: 23
Antigüedad: 8 años, 4 meses
Puntos: 0
Filtros en JavaSE

Hola a todos. Ya hacia un tiempo que no pasaba por aquí :P
Hoy tengo una cuestion de novato y aunque ya llevo mucho tiempo con Java, se me ha presentado un problema que no puedo resolver.

El problema es el siguiente:

Hacía ya un tiempo que tenía un pedazo de código en Java que copiaba el contenido de un JText a otro en tiempo real, incluso se contemplaba el borrado y la modificación del texto. Nada complicado, pero se me ocurrio actualizar ese código y hacer un filtro sencillo.
Como ya se verá en el código, estoy haciendo un filtro muy primitivo pero ya es trabajo mío trasladar este problema a casos más complejos.
El caso es que uso un indexOf() para ver si el string que estoy introduciendo coincide total o parcialmente con el contenido correcto y funciona bien si actualizo o si introduzco un caracter que no corresponde con el texto correcto pero el problema es que si borro, aunque lo que quede sea correcto, me lo marca como incorrecto. Me explico con un ejemplo y el codigo:

Código:
package nuevo;

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;
 

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);
        lblEjemplo.setText("María Antonieta");
 
        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))
        {
        	txtEjemploJTextFieldChanged();
        }
        else if (type.equals(DocumentEvent.EventType.INSERT))
        {
            txtEjemploJTextFieldChanged();
        }
        else if (type.equals(DocumentEvent.EventType.REMOVE))
        {
            txtEjemploJTextFieldChanged();
        }
    }
 
    private void txtEjemploJTextFieldChanged()
    {
        
    	System.out.println(txtEjemplo.getText());
    	System.out.println(lblEjemplo.getText().indexOf(txtEjemplo.getText()));
    	if(lblEjemplo.getText().indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
        //this.lblEjemplo.setText(this.txtEjemplo.getText());
    	
    }
 
    public static void main(String args[]) {
        Ejm07_EventoTextFieldChanged obj = new Ejm07_EventoTextFieldChanged();
        obj.setVisible(true);
    }
}
Si introduzco la "M", la salida es 0, lo que indica que encontro coincidencia.
Si introduzco una 'a' junto a la M anterior, es decir "Ma" la salida es 0.
Si introduzco una 'j' junto a lo de antes, osea, "Maj", la salida es -1 y el texto se borra.
Hasta ahi bien, pero si borro esa 'j', vuelve a quedar "Ma" pero el programa vuelve a dar salida -1 y no entiendo por que...
Alguna ayuda?
Gracias por tormarse la molestia :)
  #2 (permalink)  
Antiguo 26/07/2016, 09:39
 
Fecha de Ingreso: enero-2016
Mensajes: 3
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Filtros en JavaSE

Código:
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;
import javax.swing.text.BadLocationException;
 

public class Ejm07_EventoTextFieldChanged extends JFrame{
 
    private JTextField txtEjemplo;
    private JLabel lblEjemplo;
    private String texto;
 
    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);
        texto = "María Antonieta";
        lblEjemplo.setText(texto);
 
        setJTexFieldChanged(txtEjemplo);
    }
    
    
 
    private void setJTexFieldChanged(JTextField txt)
    {
// Esto seria opcional funciona similar a lo que tu escribiste
    	txt.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
            	txtEjemploJTextFieldChanged();
            }
        });
    }
 
 
    private void txtEjemploJTextFieldChanged()
    {
        
    	System.out.println(txtEjemplo.getText());
    	System.out.println(texto.indexOf(txtEjemplo.getText()));
    	if(texto.indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
        //this.lblEjemplo.setText(this.txtEjemplo.getText());
    	
    }
 
    public static void main(String args[]) {
        Ejm07_EventoTextFieldChanged obj = new Ejm07_EventoTextFieldChanged();
        obj.setVisible(true);
    }
}
El problema esta en:
Código:
if(lblEjemplo.getText().indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
        //this.lblEjemplo.setText(this.txtEjemplo.getText());
    	
    }
cuando sale un -1 se borra el jLabel (lblEjemplo), entonces cuando intenta de nuevo el valor del jLabel seria "" por que cambio en la ultima consulta y al hacer de nuevo la comparacion siempre devolvera -1 hasta que el valor del jTextField sea ""

*Posible solucion esta en crear una variable que contenga el texto con el valor del jLabel (lblEjemplo)
Código:
    private String texto;
y darselo al jLabel (lblEjemplo)
Código:
        texto = "María Antonieta";
        lblEjemplo.setText(texto);
ahora en ves de usar indexOf para el jLabel (lblEjemplo), usarlo con la variable texto
Código:
if(texto.indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
  #3 (permalink)  
Antiguo 29/07/2016, 09:14
 
Fecha de Ingreso: noviembre-2015
Mensajes: 23
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Filtros en JavaSE

Cita:
Iniciado por miguel_tarsisoft Ver Mensaje
Código:
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;
import javax.swing.text.BadLocationException;
 

public class Ejm07_EventoTextFieldChanged extends JFrame{
 
    private JTextField txtEjemplo;
    private JLabel lblEjemplo;
    private String texto;
 
    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);
        texto = "María Antonieta";
        lblEjemplo.setText(texto);
 
        setJTexFieldChanged(txtEjemplo);
    }
    
    
 
    private void setJTexFieldChanged(JTextField txt)
    {
// Esto seria opcional funciona similar a lo que tu escribiste
    	txt.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
            	txtEjemploJTextFieldChanged();
            }
        });
    }
 
 
    private void txtEjemploJTextFieldChanged()
    {
        
    	System.out.println(txtEjemplo.getText());
    	System.out.println(texto.indexOf(txtEjemplo.getText()));
    	if(texto.indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
        //this.lblEjemplo.setText(this.txtEjemplo.getText());
    	
    }
 
    public static void main(String args[]) {
        Ejm07_EventoTextFieldChanged obj = new Ejm07_EventoTextFieldChanged();
        obj.setVisible(true);
    }
}
El problema esta en:
Código:
if(lblEjemplo.getText().indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
        //this.lblEjemplo.setText(this.txtEjemplo.getText());
    	
    }
cuando sale un -1 se borra el jLabel (lblEjemplo), entonces cuando intenta de nuevo el valor del jLabel seria "" por que cambio en la ultima consulta y al hacer de nuevo la comparacion siempre devolvera -1 hasta que el valor del jTextField sea ""

*Posible solucion esta en crear una variable que contenga el texto con el valor del jLabel (lblEjemplo)
Código:
    private String texto;
y darselo al jLabel (lblEjemplo)
Código:
        texto = "María Antonieta";
        lblEjemplo.setText(texto);
ahora en ves de usar indexOf para el jLabel (lblEjemplo), usarlo con la variable texto
Código:
if(texto.indexOf(txtEjemplo.getText()) == -1){
    		lblEjemplo.setText("");
    	}else{
    		lblEjemplo.setText("María Antonieta");
    	}
Miguel!! Mil gracias...exactamente era ese el problema. Realmente me siento fatal el no haberme dado cuenta de ese problema antes...Ahora el tema es trasladar y sustituir el texto "Maria Antonieta" por un JList con nombres, pero de eso ya me encargo yo.

Muchisimas gracias :)

Etiquetas: filtros, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:04.