[Resolvido] Filtro jTextField ir refinando a pesquisa

2 respostas Resolvido
Sandro_Machado

Salve Rapaziada,

Estou com o seguinte problema:

criei um jTable que é populado por uma List, seria uma lista de históricos padrões para lançamento de caixa, então criei um jTextField, para filtrar esses históricos.

Então, a cada letra digitada eu queria que fosse refinando a pesquisa tipo o google.

fiz um código aqui com um um keyPressed, que chama esse método a cara letra digitada, mas acho que está muito “gambiarra”, e está com muitos problemas, um é que primeiro ele chama o evento pra depois digitar a palavra no textField, ou seja, se eu digitar C, ele não busca nada pois o JtextField está vazio, dai digito CA, ele busca a palavra C, digito CAS, ele busca CA, e assim por diante.

e o mais crítico é que na 3º letrar digitada ele dá um StringIndexOutOfBoundsException,

pois tive que comparar duas Strings e pelo que etendo o equals compara a palavra completa, então tive que pegar um substring(), com a mesma quantidade de caracteres da palavra digitada, ou seja, se eu digitar CAS, ele pega as 3 primeiras palavras de cada histórico e compara, mas é ai que dá um estouro de String. não entendo o porque me ajudem por favor!! abaixo meu código!

private void campoBuscaKeyPressed(java.awt.event.KeyEvent evt) {                                      
    int quantCar = campoBusca.getText().length();//pega quantas letras foram digitadas
    val.setRowCount(0);//zera a tabela para popular com novo resultado refinado
    for (int i = 0; i < listaHistoricos.size(); i++) {
        String pesquisa = campoBusca.getText();
        String lista = listaHistoricos.get(i).getNomeHistorico().substring(0, quantCar);
        if (pesquisa.equalsIgnoreCase(lista)) {
            val.addRow(new String[]{
                Integer.toString(listaHistoricos.get(i).getCod()),
                listaHistoricos.get(i).getTipo(),
                listaHistoricos.get(i).getNomeHistorico()
            });
        }
    }
}

2 Respostas

jorgereidinaldo

Da uma pesquisada no componente AutoCompleteDecorator.decorate(jcombobox);
jcombox.setEditable(true);

ele faz a pesquisa em uma lista

Sandro_Machado
Solucao aceita

jorgereidinaldo não conhecia este Recurso, muito interessante, obrigado pela dica, pretendo usar isso em breve, mas neste caso em específico eu preciso usar um jTable, oque não consegui por esse método que me passou.

Consegui resolver o 1º caso de chamar o KeyPressed antes de digitar a letra no textField solucionei usando o keyreleased OK.

no segundo problema descobri que era porque o substring() tentava pegar uma quantidade de caracteres superior ao que eu tinha na lista, então resolvi com um if a seguir:

if (listaHistoricos.get(i).getNomeHistorico().length() >= quantCar) {
                lista = listaHistoricos.get(i).getNomeHistorico().substring(0, quantCar);
            }

sendo assim só chama o substring() se a palavra da pesquisa for menor que a corrente, se for maior, não adiciona na jTable (óbvio se a palavra digitada for maior, sinal que não é a corrente do for).

eis o código funcionando:

private void campoBuscaKeyReleased(java.awt.event.KeyEvent evt) {                                       
    if (evt.getKeyCode() != KeyEvent.VK_ENTER) {
        int quantCar = campoBusca.getText().length();//pega quantas letras foram digitadas
        val.setRowCount(0);//zera a tabela para popular com novo resultado refinado
        for (int i = 0; i < listaHistoricos.size(); i++) {
            String pesquisa = campoBusca.getText();
            String lista = "";
            listaHistoricos.get(i).getNomeHistorico().length();
            if (listaHistoricos.get(i).getNomeHistorico().length() >= quantCar) {
                lista = listaHistoricos.get(i).getNomeHistorico().substring(0, quantCar);
            }
            if (pesquisa.equalsIgnoreCase(lista)) {
                    val.addRow(new String[]{
                    Integer.toString(listaHistoricos.get(i).getCod()),
                    listaHistoricos.get(i).getTipo(),
                    listaHistoricos.get(i).getNomeHistorico()
                });
            }
        }
    }
}
Criado 15 de fevereiro de 2016
Ultima resposta 16 de fev. de 2016
Respostas 2
Participantes 2