Preencher JTable.. SWING

Boa Madrugada galera, to fazendo TCC ai hoje tava sentado com o orientador para definirmos uma Tela de Venda do meu sistema, ai surgiu uma dúvida como selecionar uma peça no estoque para que ela possa ser vendida, ai pensamos em ComboBox, mas ai surgiu o problema, e se no estoque estiver 500 peças… o cara tería que sair procurando a peça entre as 500 existentes dentrodo ComboBox… e outra coisa se tiver peças com o mesmo nome???.ai então decidimos não usar ComboBox, e pensamos em uma busca onde o cara iría digitando o nome da Peças e os dados referentes a aquele nome iríam aparecendo na JTable… tipo se o cara digitar no campo de busca “Catraca” a JTable iría ser preenchida com todos os dados referentes a aquele nome digitado “Nome,Marca,Preço etc…”… Agora como eu faço para que ao Usuário do Sistema digitar o nome no campo de Busca, a JTable ir sendo preenchida com todos os Dados do Banco referente ao nome digitado???
Obs.: ( Estou utilizando o NetBens para criar interface )

Obrigado!!! :mrgreen:

É melhor você colocar um botão de busca. Esse negócio de ir buscando a medida que se digita dá muitos problemas, principalmente quando o número de dados aumenta e o processo começa a ficar lento.

Isso é verdade Viny, mas você concorda em eu “Não” Usar o comboBox???
Só para motios de estudo e aprendizado, como sería o código que preencheria a JTable a medida que o Usuario do sistema fosse digitando em um campo de busca??
Achei muito interresante e gostaría de ver como funciona!!

Sim, acho que combo não é o caso mesmo.

Você teria que sobrescrever um document. Esse document teria que refazer a consulta no banco (com um like) e atualizar seu model.

Certo, mas eu imagino como sería esse código, ja tem um tempinho que to tentando vizualiza-lo e não consigo!!

E ai galera… tava prescisando dessa parada ai… :?

Boa noite a todos.

Concordo com o Vini Godoy.

Utilizar o combobox não é viável, visto que se a tabela de produtos ou de estoques possuirem mais de 1000 registros, como ficaria o scroll da combo :?: E a pesquisa ficaria demorada, não ficaria :?:

Quanto a segunda opção, de voce pesquisar a medida que digita dentro de um JTextField, medida esta que chamamos de pesquisa incremental, só funciona em tabelas com poucos registros, e mesmo assim causa queda de performance no banco, visto que voce está buscando dados continuamente no banco, dando refresh e etc, quando o certo é fazer uma busca momentânea, por isso a dica do Vini de colocar um botão de pesquisa me parece ideal.

Voce pode e até deve usar o JTable, porém coloque um JTextField em que voce possa digitar a pesquisa e um JButtom onde voce possa pesquisar toda a string de caracteres do JTextField de uma vez.

Outra dica, utilize instruções SQL com o operador LIKE, e se voce estiver utilizando o banco de dados Postgres, voce tem a opção do ILIKE que é case insensitive, ou seja, pesquisa caracteres maiúsculos e minúsculos ao mesmo tempo.

Mais uma dica, quanto ao JTable, atualize os dados com uma classe herdada de AbstractTableModel que é mais dinâmica do que DefaultTableModel, após criar essa classe Abstrata, é só setar o JTable dessa maneira.

   meujtable.setModel(new MinhaClasseAbstractModel(meusdados));

++ against JComboBox.E posso citar por experiência própria essa semana mesmo:
Um usuário queria que a cada mudança na combo, carregasse uma JTable com esses dados, sem clicar em botão nem nada, só de mexer na combo.Batata: coloquei 5mil registros, estou com um problema de mouse acelerado, quandocliquei nela, deu uma “segurada”, e o ItemState foi chamado 6x!Resultado:OutOfMemoryError.Num botão(possui área menor) foram 2x chamadas(na verdade foram dois cliques).
Cuidado com o Excesso de “dinamismo” nas combos.Só faça isso com componentes não variáveis, ou sem muuuitos registros.

[quote=discorpio]Boa noite a todos.

Concordo com o Vini Godoy.

Utilizar o combobox não é viável, visto que se a tabela de produtos ou de estoques possuirem mais de 1000 registros, como ficaria o scroll da combo :?: E a pesquisa ficaria demorada, não ficaria :?:

Quanto a segunda opção, de voce pesquisar a medida que digita dentro de um JTextField, medida esta que chamamos de pesquisa incremental, só funciona em tabelas com poucos registros, e mesmo assim causa queda de performance no banco, visto que voce está buscando dados continuamente no banco, dando refresh e etc, quando o certo é fazer uma busca momentânea, por isso a dica do Vini de colocar um botão de pesquisa me parece ideal.

Voce pode e até deve usar o JTable, porém coloque um JTextField em que voce possa digitar a pesquisa e um JButtom onde voce possa pesquisar toda a string de caracteres do JTextField de uma vez.

Outra dica, utilize instruções SQL com o operador LIKE, e se voce estiver utilizando o banco de dados Postgres, voce tem a opção do ILIKE que é case insensitive, ou seja, pesquisa caracteres maiúsculos e minúsculos ao mesmo tempo.

Mais uma dica, quanto ao JTable, atualize os dados com uma classe herdada de AbstractTableModel que é mais dinâmica do que DefaultTableModel, após criar essa classe Abstrata, é só setar o JTable dessa maneira.

meujtable.setModel(new MinhaClasseAbstractModel(meusdados)); [/quote]
Ai discorpion, eu não sabía que o Like do Postgres é Case Insensitive Obrigado… ah eu to trabalhando com AbstractTableModel sim… :mrgreen: !!
Falando dessa pesquisa incremental ai, eu acho que ela dará certo na minha aplicação, por que na tabela que desejo buscar contem apenas 3 registros são eles : Nome, Marca e Modelo… esse tipo de pesquisa ai é do tipo que eu solicitei??? o Usuário vai digitando os dados no TextField e a JTable vai se alto-preenchendo??
Caso for será que tinha como eu utiliza-la??

Boa noite Anderson.

Apenas duas correções:

1º) O Postgres trabalha tanto com o LIKE quanto com ILIKE (começando com a letra I de Insensite), o LIKE normal e case sensitive.

2º) Nome, Marca e Modelo são atributos de sua tabela, portanto são nomes dos campos e não registros, voce deve atentar que possuir apenas tres campos numa tabela, não significa que ela não conterá mais de mil registros.
Ex:
´

Repare que só ai em cima já são mais do que tres registros, imagine se eu citar todas as marcas de processadores que foram lançados desde 1970 até agora. :shock: :roll: :stuck_out_tongue:

Discopion, eu tava dando uma olhada aqui na net e achei essa um site estranho pra caramba, e nele tinha uma classe que de funciona da seguinte maneira, vc lista todos os dados do Banco de Dados na sua JTable, ai vc vincula essa classe em seu TextField, ai a medida que vc for digitando no TextField os dados da JTable vão sendo selecionados, e vc pode digitar qualquer campo da JTable que ele seleciona, e ainda é Case insensitive… cara é perfeita…
Da uma olhadinha nela ai…

[code]/*

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

import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import org.jdesktop.beansbinding.Converter;

/**

  • Binding converter between String and regex RowFilter (encapsulated by RowSorterToStringConverter).

  • */
    public class RowSorterConverter extends Converter {

    private JTable table;

    public JTable getTable() {
    return table;
    }

    public void setTable(JTable table) {
    this.table = table;
    }

    @Override
    public Object convertForward(Object value) {
    return value.toString();
    }

    @Override
    public Object convertReverse(Object mask) {
    TableRowSorter sorter = new TableRowSorter(table.getModel());

    // o seguinte comando torna o filtro case-sensitive. se você
    //quisre o fitro case-insensitive, descomente a linha abaixo e
    //comente as 7 linhas abaixo dela
    //sorter.setRowFilter(RowFilter.regexFilter(".*" + mask + ".*"));
    
    //as seguintes 7 linhas criam um filtro case-sensitie. se você deseja
    //um filtro case-insensitive, comente essas linhas e descomente a linha
    //acima
    String m = mask.toString();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < m.length(); i++) {
        char c = m.charAt(i);
        sb.append('[').append(Character.toLowerCase(c)).append(Character.toUpperCase(c)).append(']');
    }
    sorter.setRowFilter(RowFilter.regexFilter(".*" + sb + ".*"));
    return sorter;
    

    }
    }
    [/code]

Mas tem uma coisa discopion, eu não conseguir entender o que essa classe ta fazendo :thumbdown: …será que tinha como vc me explicar??? :XD:

Obrigado mais uma vez!!!