Busqueda automatica en JTextField con persistencias

Buenos días a todos, estoy trabajando con persistencias y Mysql. Hice un programa que modifica, elimina, agrega mis productos aqui les muestro como lo estoy haciendo: https://www.dropbox.com/s/mkq0yi1a3p9yo5c/CRUD.PNG?m
Quiero hacer una busqueda sensitiva que mientras escribo los datos que deseo en la tabla me muestre automaticamente.
Ademas digamos que en mi Base de datos tengo un producto Camisa con codigo "C001". Yo quiero agregar un nuevo producto digamos que vuelvo a escribir el mismo codigo "C001", como haria para que automaticamente me diga que el codigo ya existe en la base de datos.
De antemano gracias por su ayuda :D

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

?

Quiero hacer una busqueda sensitiva que mientras escribo los datos que deseo en la tabla me muestre automaticamente.

¿Sería como las sugerencias que por ejemplo, te da google cuando vas escribiendo sobre la caja de búsqueda?

como haria para que automaticamente me diga que el codigo ya existe en la base de datos

Con un SELECT? si te regresa una coincidencia, es que el código ya existe.

Imagen de CuicaJavier

Persistencias

Claro como el buscador de google que me muestre datos mientras escribo eso en Java como lo haria.
PD: Estoy haciendo el programa para escritorio con JPA, Mysql y Netbeans Platform.

Imagen de neko069

Para la caja de sugerencias.

Encontré comentarios útiles en éste link de SO y en éste también; también encontré otro ejemplo, pero usa un JComboBox, espero sirva y por último, en el tutorial oficial de Oracle, en el apartado de How to use Text Areas en el segundo ejemplo, también hay algo sobre sugerencias de autocompletado.

Imagen de Jose Manuel

También podría servirte esto.

También podría servirte esto. Solo que me parece que no utiliza ningún motor de persistencia.
Saludos y si tienes suerte nos avisas como quedo el resultado.

MIra en este caso yo he usado

MIra en este caso yo he usado un evento del textfiel que se llama caret y te vas a la pestaña caret update. No se que motor de persistencia uas pero la funcionalidad del caret es obtener la tecla tecleada y asi podras usar un like'Variable '% depenediendo del dato que busques.

saludos

Imagen de CuicaJavier

Uso JPA en Netbeans Platform

E estado buscando informacion sobre Caret por ejemplo hice este ejemplo:

txtCodAlma.addCaretListener(new javax.swing.event.CaretListener() {

            @Override
            public void caretUpdate(CaretEvent evt) {
                dbTextCaretUpdate(evt);
            }
        });
       
    }
   
    private void dbTextCaretUpdate(javax.swing.event.CaretEvent evt){
        enableOk();
    }
    private void enableOk(){
        txtDesAlma.setEnabled(
                (txtCodAlma.getText().length() > 0));
    }

Pero no encontre informacion con JTextField y JTable.

Alguien tendra un ejemplo con que guiarme!

Imagen de neko069

Modificación

Bien podría ser algo como:

txtCodAlma.addCaretListener(new javax.swing.event.CaretListener() {

            @Override
            public void caretUpdate(CaretEvent evt) {
                      enableOk( txtCodAlma.getText() );//si no estas usando el evento en el metodo, no tiene caso pasarselo, no crees?
//mejor le pasas el texto
            }
        });
       
    }
   
    private void enableOk( String elString){
         if( elString.length() > 0){

              /*aqui invocas un metodo que hayas construido para que te valide el string que estas pasando
                 y dependiendo si existe o no ya puedes hacer algo

              */
         }
    }

Nada más un comentario adicional, según leí el evento que usas se detona cada que introduces un caracter; entonces
deberías de checar que tanto acceso a la base de datos (porque cada que escribes un caracter, se traduce en una consulta)
no vaya a ser un problema.

Imagen de CuicaJavier

Imagen de muestra

Actualmente estoy migrando de Assembler a Java, y tengo esta imagen: https://www.dropbox.com/s/fqs751a6hzgwwd8/Datos%20no%20existente.PNG
Como veran en la parte superior ay un mensajito "***>DATO NO EXISTE!!!" cuando termine de DIGITAR el numero de Documento "0010193457" automaticamente me sale el mensaje. Algun ejemplo en concreto¡!!
Gracias Neko por la respuesta pero sigo sin entender como validarlo u.u

Imagen de neko069

El que no entiende soy yo

Ya casi está tu código, de hecho con el ejemplo que te pasé, sólo tienes que recuperar un valor que te indique si tu texto que pasas a la base de datos existe o no, no veo demasiada complicación, de hecho en el ejemplo que muestro te pongo en comentario dónde pones el código que valida.
Postea código donde recuperes un registro por su ID, de ahí podemos partir para completar el ejemplo.

Imagen de CuicaJavier

Encontre otra forma

Leyendo la documentacion de Oracle: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html
Encontre este ejercicio: http://docs.oracle.com/javase/tutorial/uiswing/examples/components/Table...
Que es lo que yo queria exactamente.

public TableFilterDemo() {
        super();
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
 
        //Create a table with a sorter.
        MyTableModel model = new MyTableModel();
        sorter = new TableRowSorter<MyTableModel>(model);
        table = new JTable(model);
        table.setRowSorter(sorter);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
 
        //For the purposes of this example, better to have a single
        //selection.
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
        //When selection changes, provide user with row numbers for
        //both view and model.
        table.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    public void valueChanged(ListSelectionEvent event) {
                        int viewRow = table.getSelectedRow();
                        if (viewRow < 0) {
                            //Selection got filtered away.
                            statusText.setText("");
                        } else {
                            int modelRow =
                                table.convertRowIndexToModel(viewRow);
                            statusText.setText(
                                String.format("Selected Row in view: %d. " +
                                    "Selected Row in model: %d.",
                                    viewRow, modelRow));
                        }
                    }
                }
        );
 
 
        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);
 
        //Add the scroll pane to this panel.
        add(scrollPane);
 
        //Create a separate form for filterText and statusText
        JPanel form = new JPanel(new SpringLayout());
        JLabel l1 = new JLabel("Filter Text:", SwingConstants.TRAILING);
        form.add(l1);
        filterText = new JTextField();
        //Whenever filterText changes, invoke newFilter.
        filterText.getDocument().addDocumentListener(
                new DocumentListener() {
                    public void changedUpdate(DocumentEvent e) {
                        newFilter();
                    }
                    public void insertUpdate(DocumentEvent e) {
                        newFilter();
                    }
                    public void removeUpdate(DocumentEvent e) {
                        newFilter();
                    }
                });
        l1.setLabelFor(filterText);
        form.add(filterText);
        JLabel l2 = new JLabel("Status:", SwingConstants.TRAILING);
        form.add(l2);
        statusText = new JTextField();
        l2.setLabelFor(statusText);
        form.add(statusText);
        SpringUtilities.makeCompactGrid(form, 2, 2, 6, 6, 6, 6);
        add(form);
    }
 
    /**
     * Update the row filter regular expression from the expression in
     * the text box.
     */

    private void newFilter() {
        RowFilter<MyTableModel, Object> rf = null;
        //If current expression doesn't parse, don't update.
        try {
            rf = RowFilter.regexFilter(filterText.getText(), 0);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        sorter.setRowFilter(rf);
    }

Mis proyecto lo estoy haciendo con JPA y MySQL, aun no tengo mucho conocimiento sobre persistencias, si no fuera mucho pedir espero me echen una mano para implementarlo con JPA

Imagen de neko069

Tutorial

Lee primero el tutorial oficial de Oracle sobre JPA y ya después abres otro tema con tu duda en específico.

Imagen de CuicaJavier

Gracias por tu tiempo Neko

public final class CodAlmacenTopComponent extends TopComponent{

    private AlmacenTableModel model = new AlmacenTableModel();
    private TableRowSorter<AlmacenTableModel> sorter;
   
    public CodAlmacenTopComponent() {
        initComponents();
        setName(Bundle.CTL_CodAlmacenTopComponent());
        setToolTipText(Bundle.HINT_CodAlmacenTopComponent());
        //-------------------------------------------
        //Create a table with a sorter
        sorter = new TableRowSorter<AlmacenTableModel>(model);
       
        tblAlmacen.setRowSorter(sorter);
       
        //Para este ejemplo,lo mejor es tener una sola seleccion
        tblAlmacen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //Cuando se cambia la selección, proporcionará al usuario un número
        //de fila para visualizar y modelo.
        tblAlmacen.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent event){
                    int viewRow = tblAlmacen.getSelectedRow();
                    if(viewRow < 0){
                        //Selección consiguió filtrado de distancia.
                        txtStatus.setText("");
                    } else {
                        int modelRow =
                                tblAlmacen.convertRowIndexToModel(viewRow);
                        txtStatus.setText(String.format("Selected Row in view: %d. " +
                                    "Selected Row in model: %d.",
                                    viewRow, modelRow));
                    }
                    }
                }
        );
        //Cada vez que cambia filterText, invocar NewFilter
        txtBusqueda.getDocument().addDocumentListener(
                new DocumentListener() {

                @Override
                public void insertUpdate(DocumentEvent e) {
                    newFilter();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    newFilter();
                }

                @Override
                public void changedUpdate(DocumentEvent e) {
                    newFilter();
                }
                   
            }
        );

private void newFilter(){
        RowFilter<AlmacenTableModel, Object> rf = null;
        //Si la expresión actual no analiza, no se actualizan.
        try {
            rf = RowFilter.regexFilter(txtBusqueda.getText(), 0);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        sorter.setRowFilter(rf);
    }

Lo resolvi de esto modo :)

Imagen de CuicaJavier

Esto es mi AlmacenTableModel

private static final class AlmacenTableModel extends AbstractTableModel{

        private String[] columns = {"Cc","Descripción","Desc. Abrev","SGR","SNI","SVS","SNT","Sc"};
        private List<MaCodAlm> data = new ArrayList<MaCodAlm>();
       
        public MaCodAlm getRow(int row){
            return data.get(row);
        }
       
        @Override
        public int getRowCount() {
            return data.size();
        }

        @Override
        public int getColumnCount() {
            return columns.length;
        }

        @Override
        public String getColumnName(int col){
            return columns[col];
        }
       
        @Override
        public Object getValueAt(int row, int col) {
            MaCodAlm maCodAlm = data.get(row);
           
            switch(col){
                case 0: return maCodAlm.getCodAlma();
                case 1: return maCodAlm.getDesAlma();
                case 2: return maCodAlm.getAbvAlma();
                case 3: return maCodAlm.getSecAlma();
                case 4: return maCodAlm.getNsgrAlma();
                case 5: return maCodAlm.getNsniAlma();
                case 6: return maCodAlm.getNsvsAlma();
                case 7: return maCodAlm.getNsntAlma();
                case 8: return maCodAlm.getStAlma();
            }
            return "";
        }
        public List<MaCodAlm> getData(){
            return data;
        }
       
    }

Imagen de CuicaJavier

Tengo una ultima duda

Ay algo que no me sale bien, aqui les muestro la imagen: https://www.dropbox.com/s/8yh1dc4x3w6a3ez/DudaFilterRowTable.PNG
Como veran cuando presiono la letra "A" me muestra "A1" y "CA", algun consejo para que solo me muestren todas las palabras que comienzen con "A".