Algoritmo para pesquisa em Jtable

8 respostas
d34d_d3v1l

Gente criei um algoritmo de pesquisa aqui, que vou compartilhar com vocês. O que ele faz: Ordena a jtable com o que você pesquisou, por exemplo pesquisou por: “enro” vai colocar nas primeiras posições da tabela, tudo o que começar com “enro” … tipo
enroladinho de salsicha
enroladinho de queixo

e depois colocar os demais itens que não fazem parte da pesquisa…

OBS: eu uso um vetor como “bd”, então por isso que o código está assim…

// pesquisando é a String que voce ta querendo achar...
        String pesquisando = campoPesq.getText();
        pesquisando = pesquisando.toUpperCase();
        String pesquisado = "";
        int tamanho = pesquisando.length();
        
        int i;
        
        //vai armazenar os índices dos itens de pesquisa que não fazem parte
        //do que o usuario esta pesquisando
        int faltaram[] = new int[1000];
        int countFaltaram = 0;

        //limpar a tabela
        modelo.limpar();

        //bd.produtos é o meu 'banco de dados'
        for (i = 0; bd.produtos[i] != null; i++) {

            try {
                //Pegar o elemento do BD e colocar tudo maiusculo
                pesquisado = bd.produtos[i].getNome().substring(0, tamanho);
                pesquisado = pesquisado.toUpperCase();

                //se for igual
                if (pesquisando.equals(pesquisado)) {
                    //adiciono o item na tabela e seleciono a 1 linha da tabela
                    modelo.addProduto(bd.produtos[i]);
                    jTable1.setRowSelectionInterval(0, 0);

                } else {
                    //se nao for, vou colocar o seu indice no vetor
                    faltaram[countFaltaram] = i;
                    countFaltaram++;
                }
            } catch (StringIndexOutOfBoundsException e) {
                faltaram[countFaltaram] = i;
                countFaltaram++;
            }
        }

        //agora para adicionar a tabela os que faltaram:
        for (i = 0; i < countFaltaram; i++) {
            modelo.addProduto(bd.produtos[faltaram[i]]);
        }

        //apago o que o usuario digitou la no campo de pesquisa
        campoPesq.setText("");

Porém o que eu gostaria de fazer é:

Outra coisa, quando eu mudar isso ai para um banco de dados não sei o que eu vou fazer… vou ter muito trabalho, mas aposto que alguem poderá me ajudar em caso de dúvidas!

Obrigado

8 Respostas

d34d_d3v1l

Voces acham interessante,

eu pegar tudo do banco de dados, criar objetos, e joga-los em um vetor para utilizar essa pesquisa que estou usando ?

Assim, eu nao vou precisar modificar totalmente os meus algoritmos especificos…
o que vcs acham?

javer

Eu “acho” que você deveria fazer assim:

  1. Carregar a lista de objetos do banco de dados através de um DAO
  2. Criar um modelo para sua JTabel (AbstractTableModel)
  3. Colocar a lista no modelo
  4. Implementar a pesquisa nos dados que estão na lista no modelo.
d34d_d3v1l

javer:
Eu “acho” que você deveria fazer assim:

  1. Carregar a lista de objetos do banco de dados através de um DAO
  2. Criar um modelo para sua JTabel (AbstractTableModel)
  3. Colocar a lista no modelo
  4. Implementar a pesquisa nos dados que estão na lista no modelo.

uai
é mais ou menos isso que eu faço…
o modelo que eu uso eu msmo criei… :smiley:

javer

Mostre os seguintes pedaços de códigos:

  • onde carrega a lista de objetos
  • onde coloca a lista no modelo
  • o código do modelo
  • o código no evento do campo de texto que vai pesquisar
d34d_d3v1l

eis o modelo para a tabela de produtos por exemplo da janela ‘gerenciar produtos’…
Está com algumas coisas que não se deve fazer, por exemplo:
Produto Produto;

mas só esta assim porq ue usei Control + H para substituir de outros modelos que eu tinha…
mas funciona perfeitamente…

package regra;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class ProdutoTableModelMesas extends AbstractTableModel {


    private static final long serialVersionUID = 1L;

    /* Lista de Produto que representam as linhas. */
    private List<Produto> linhas;

    /* Array de Strings com o nome das colunas. */
    private String[] colunas = new String[]{
        "Código","Nome","Fornecedor","Preço"};



    /* Cria um ProdutoTableModel vazio. */
    public ProdutoTableModelMesas() {
        linhas = new ArrayList<Produto>();
    }

    /* Cria um ProdutoTableModel carregado com
     * a lista de Produto especificada. */
    public ProdutoTableModelMesas(List<Produto> listaDeProduto) {
        linhas = new ArrayList<Produto>(listaDeProduto);
    }


    /* Retorna a quantidade de colunas. */
    @Override
    public int getColumnCount() {
        // Está retornando o tamanho do array "colunas".
        return colunas.length;
    }

    /* Retorna a quantidade de linhas. */
    @Override
    public int getRowCount() {
        // Retorna o tamanho da lista de Produto.
        return linhas.size();
    }


    @Override
    public String getColumnName(int columnIndex) {
        // Retorna o conteúdo do Array que possui o nome das colunas
        return colunas[columnIndex];
    }

    ;

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return String.class;
    }

    ;


    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
            Produto Produto = linhas.get(rowIndex);

        // Retorna o campo referente a coluna especificada.
        // Aqui é feito um switch para verificar qual é a coluna
        // e retornar o campo adequado. As colunas sãoas mesmas
        // que foram especificadas no array "colunas".
        switch (columnIndex) {

            // Seguindo o exemplo: "Código","Nome","Fornecedor","Preço", "Estoque"};
            case 0:
                return Produto.getCodigo();
            case 1:
                return Produto.getNome();
            case 2:
                return Produto.getForn().getNome();
            case 3:
                return Produto.getPreco();
            default:
                // Isto não deveria acontecer...
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

 @Override
 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      Produto Produto = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado

     switch (columnIndex) { // "Código","Nome","Fornecedor","Preço", "Estoque"};
         case 0:
             Produto.setCod(aValue.toString());
         case 1:
             Produto.setNome(aValue.toString());
         case 2:

         case 3:
             Produto.setPreco(Double.parseDouble(aValue.toString()));

         default:
             // Isto não deveria acontecer...
     }
     fireTableCellUpdated(rowIndex, columnIndex);
     }

    ;

        public void setValueAt(Produto aValue, int rowIndex) {
        Produto Produto = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado
        Produto.setNome(aValue.getNome());
        Produto.setPreco(aValue.getPreco());
        Produto.setFornecedor(aValue.getForn());


        fireTableRowsUpdated(rowIndex, rowIndex);
    }
    ;


    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

///////////////////////////////////////////////////////////////////////métodos que você vai usar:


    public Produto getProduto(int indiceLinha) {
        return linhas.get(indiceLinha);
    }



    /* Adiciona um registro. */
    public void addProduto(Produto m) {
        // Adiciona o registro.
        linhas.add(m);


        int ultimoIndice = getRowCount() - 1;

        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    /* Remove a linha especificada. */
    public void removeProduto(int indiceLinha) {
        linhas.remove(indiceLinha);

        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }

    /* Adiciona uma lista de Produto ao final dos registros. */
    public void addListaDeProduto(List<Produto> Produto) {
        // Pega o tamanho antigo da tabela.
        int tamanhoAntigo = getRowCount();

        // Adiciona os registros.
        linhas.addAll(Produto);

        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
    }

    /* Remove todos os registros. */
    public void limpar() {
        linhas.clear();


        fireTableDataChanged();
    }

    /* Verifica se este table model esta vazio. */
    public boolean isEmpty() {
        return linhas.isEmpty();
    }



}

eis o evento do campo:

String pesquisando = campoPesq.getText();
        pesquisando = pesquisando.toUpperCase();
        String pesquisado = "";
        int tamanho = pesquisando.length();
        int i;
        int faltaram[] = new int[1000];
        int countFaltaram = 0;

        modelo.limpar();

        for (i = 0; bd.produtos[i] != null; i++) {

            try {
                pesquisado = bd.produtos[i].getNome().substring(0, tamanho);
                pesquisado = pesquisado.toUpperCase();

                if (pesquisando.equals(pesquisado)) {
                    modelo.addProduto(bd.produtos[i]);
                    jTable1.setRowSelectionInterval(0, 0);

                } else {
                    faltaram[countFaltaram] = i;
                    countFaltaram++;
                }
            } catch (StringIndexOutOfBoundsException e) {
                faltaram[countFaltaram] = i;
                countFaltaram++;
            }
        }

        for (i = 0; i < countFaltaram; i++) {
            modelo.addProduto(bd.produtos[faltaram[i]]);
        }

        campoPesq.setText("");
    }
javer

Entendi, então, se você pretende "filtrar" a pesquisa dentro da própria lista que já havia carregado você pode fazer isso no próprio modelo, agora se você quer recarregar uma nova lista do banco de dados você pode fazer uma nova pesquisa a cada evento e usar algo como um LIKE na coluna da tabela do banco de dados.

Espero que seu objeto Produto esteja mais ou menos como esse abaixo:
public class Produto implements Cloneable, Serializable, Comparable<Produto> {
...

    @Override
    public Object clone() {
        Produto copy = null;
        try {
            copy = (Produto) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e.toString());
        }
        return copy;
    }

    @Override
    public int hashCode() {
        return (int) (new Integer(this.getCodigo()) * 127); // isso aqui é apenas um número inteiro
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Produto other = (Produto) obj;
        if (!this.getCodigo().equals(other.getCodigo())) {
            return false;
        }
        return true;
    }

    public int compareTo(Produto o) {
        if (this.hashCode() < o.hashCode()) {
            return -1;
        } else if (this.hashCode() == o.hashCode()) {
            return 0;
        } else if (this.hashCode() > o.hashCode()) {
            return 1;
        } else {
            return 1;
        }
    }

    @Override
    public String toString() {
        return this.getNome();
    }
...
d34d_d3v1l

meu produto não é nada como isso…

package regra;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Usuário
 */
public class Produto {

    private String nome;
    private int qunt;
    private double preco;
    public String codigo="000";
    public int quantidadeVendida=0;
    public double precoVendido=0;
    Fornecedor forn;

    public void setFornecedor(Fornecedor forn){
        this.forn = forn;
    }
    
    public void setPrecoVendido(double p){
        precoVendido+= p;
    }

    public void setCod(String cod){
        this.codigo = cod;
    }

    public double getPrecoVendido(){
        return precoVendido;
    }
    public void setQuantidadeVendida(int i){
        quantidadeVendida+= i;
    }

    public int QuntVendida(){
        return quantidadeVendida;
    }
    public Produto(String nome, int qunt, double preco, Fornecedor forn) {
        this.nome = nome;
        this.qunt = qunt;
        this.preco = preco;
        this.forn = forn;
    }

    public void addEstoque(int qnt){
        this.qunt += qnt;
    }

    public void dimEstoque(int qnt){
        this.qunt -= qnt;
    }

    public Fornecedor getForn() {
        return forn;
    }

    public String getCodigo(){
        return this.codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public int getQunt() {
        return qunt;
    }

    public void setQunt(int qunt) {
        this.qunt = qunt;
    }

    

}
javer
Ok, fica melhor trabalhar com um objeto quando ele tem esse formato:
import java.io.Serializable;

public class Produto implements Cloneable, Serializable, Comparable<Produto> {

    private String nome;
    private int qunt;
    private double preco;
    public String codigo = "000"; // Recomendo que codigo seja sempre inteiro
    public int quantidadeVendida = 0;
    public double precoVendido = 0;
    Fornecedor forn;

    public void setFornecedor(Fornecedor forn) {
        this.forn = forn;
    }

    public void setPrecoVendido(double p) {
        precoVendido += p;
    }

    public void setCod(String cod) {
        this.codigo = cod;
    }

    public double getPrecoVendido() {
        return precoVendido;
    }

    public void setQuantidadeVendida(int i) {
        quantidadeVendida += i;
    }

    public int QuntVendida() {
        return quantidadeVendida;
    }

    public Produto(String nome, int qunt, double preco, Fornecedor forn) {
        this.nome = nome;
        this.qunt = qunt;
        this.preco = preco;
        this.forn = forn;
    }

    public void addEstoque(int qnt) {
        this.qunt += qnt;
    }

    public void dimEstoque(int qnt) {
        this.qunt -= qnt;
    }

    public Fornecedor getForn() {
        return forn;
    }

    public String getCodigo() {
        return this.codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public int getQunt() {
        return qunt;
    }

    public void setQunt(int qunt) {
        this.qunt = qunt;
    }
    
    
    @Override
    public Object clone() {
        Produto copy = null;
        try {
            copy = (Produto) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e.toString());
        }
        return copy;
    }

    @Override
    public int hashCode() {
        return getCodigo().hashCode();
        //return (int) (new Integer(this.getCodigo()) * 127);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Produto other = (Produto) obj;
        if (!this.getCodigo().equals(other.getCodigo())) {
            return false;
        }
        return true;
    }

    public int compareTo(Produto o) {
        if (this.hashCode() < o.hashCode()) {
            return -1;
        } else if (this.hashCode() == o.hashCode()) {
            return 0;
        } else if (this.hashCode() > o.hashCode()) {
            return 1;
        } else {
            return 1;
        }
    }

    @Override
    public String toString() {
        return this.getNome();
    }
}
Eu recomendo que a propriedade codigo seja sempre inteiro (assim como um INT ou INTEGER no banco de dados).
Criado 13 de fevereiro de 2011
Ultima resposta 14 de fev. de 2011
Respostas 8
Participantes 2