JTable

Olá pessoal
como faço para fazer uma nova pesquisa sem apagar do JTable a pesquisa anterior, ou seja eu consigo trazer do banco uma linha da tabela do meu banco normal e mostro ela no meu JTable, o problema é que quando faço uma nova pesquisa, a pesquisa anterior que está visivel no meu JTable é substituida pela nova pesquisa, e o que eu queria era que a nova pesquisa aparecesse em baixo da pesquisa anteior na linha da JTable abaixo segue meu codigo

Este é o método que crio minha tabela e a trago do banco para a JTable

public void preencherTabela(String sql){   // sql é meu metodo responsavel pelas string de coneccao com meu banco
    ArrayList dados = new ArrayList();
String[] Colunas = new String[]{"CODIGO","NOME","PRECO"};
    conecta.executaSql(sql);   
    try{
        conecta.rs.first();
        do{
dados.add(new Object[]{conecta.rs.getInt("codigo"),conecta.rs.getString("nome"),conecta.rs.getDouble("preco")});
          }while(conecta.rs.next());        
    }catch(SQLException ex){   
      } 
      ModeloTabela modelo = new ModeloTabela(dados, Colunas);
      Tabela.setModel(modelo);
      Tabela.getColumnModel().getColumn(0).setPreferredWidth(65);
      Tabela.getColumnModel().getColumn(0).setResizable(false);
      Tabela.getColumnModel().getColumn(1).setPreferredWidth(245);
      Tabela.getColumnModel().getColumn(1).setResizable(false); 
       Tabela.getColumnModel().getColumn(2).setPreferredWidth(65);
      Tabela.getColumnModel().getColumn(2).setResizable(false);       
      Tabela.setAutoResizeMode(Tabela.AUTO_RESIZE_OFF);
      Tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }

tenho um botão que quando eu clico ele faz a busca e me retorna a linha da tabela do meu banco e a mostra no meu, JTable

dentro do meu botão está este codigo

try {
   preencherTabela("select * from vendas where codigo ='"+pre.getText()+"'");       
            conecta.rs.first();
     } catch (SQLException ex) {
             JOptionPane.showMessageDialog(null, "Erro ao se conectar com banco de dados: "+ex.getMessage());
        }

Na classe ModeloTabela adicione o seguinte metodo:

private final ArrayList dadosDaTabela; // Não sei como vc nomeou seu array de dados


public void addLista(ArrayList lista){ 
     for (Object objeto: lista){
              dadosDaTabela.add(objeto);
     }
 }

E sempre que for feito uma pesquisa ele ira adicionar ao Array, porem como vc pode imaginar, poderá haver duplicidades de dados, mas isso pode ser corrigido com um IF no FOR.

1 curtida

Amigo desculpe minha ignorância, pois sou novo em programação e em java,
testei seu códido e da erro em ( add ), abaixo segue minha classe modelo tabela

package utilitarios;

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

public class ModeloTabela extends AbstractTableModel{

private ArrayList linhas = null;
private String[] colunas = null;
public ModeloTabela(ArrayList lin,String[] col){
setLinhas(lin);
setColunas(col);       
}

public ArrayList getLinhas(){
  return linhas;
}

public void setLinhas(ArrayList dados){
  linhas = dados;
}

public String[] getColunas(){
  return colunas;
}
public void setColunas(String[] nomes){
 colunas = nomes;
}
public int getColumnCount(){
  return colunas.length;
}
public int getRowCount(){
  return linhas.size();
}
public String getColumnName(int numCol){
  return colunas[numCol];
}
public Object getValueAt(int numLin, int numCol){
  Object[] linha = ( Object[])getLinhas().get(numLin);
  return linha[numCol];
}
     // aqui abaixo está sua sugestão

public void listar(ArrayList lista){
for (Object objeto: lista){
ModeloTabela.add(objeto); // e aqui da erro no add
}
}

}

favor preciso de uma luz, e obrigado pela ajuda prestada com as respostas postadas

Achei seu erro amigo, quanto a ignorância citada, relaxa, todos nós aprendemos do inicio. Bem vamos la:

La na sua classe controladora da tabela (onde vc deu o setModel(??) para a tabela, vc fara um novo select de banco, este select estaria suposto a criar um novo modelo com os valores antigos apagados, porém vc colcocara o seguinte código no botão que fara a busca:

ModeloTabela table = (ModeloTabela) jTable1.getModel(); // pega o modelo sem desconstruir
ArrayList listaNova = new classeDAO( jTextfield1.getText()); // o textfield é onde vc pega o texto, a     classeDAO é onde vc pega faz o select do banco
table.addList(listaNova); //adiciona a listaNova na tabela

La na classe Modelo da Tabela devera ter este metodo:

public void addLista(ArrayList listaAdicional){ //Pode copiar, é para dar certo
    for (Object objeto: listaAdicional){
          lista.add(objeto);
    }
    this.fireDataChanged(); // Acho q se escreve assim, n lembro, mas é algo parecido
}

ola amigo belezzzz,
eu não criei uma classe Dao, o que tenho na verdade é um metodo que me retorna uma string sql fazendo assim a pesquisa no banco, abaixo esta meu metodo
public void preencherTabela(String sql){ //
ArrayList dados = new ArrayList();
String[] Colunas = new String[]{“CODIGO”,“NOME”,“PRECO”};
conecta.executaSql(sql);
try{
conecta.rs.first();
do{
dados.add(new Object[]{conecta.rs.getInt(“codigo”),conecta.rs.getString(“nome”),conecta.rs.getDouble(“preco”)});

     }while(conecta.rs.next());
    
}catch(SQLException ex){   
  } 
  ModeloTabela modelo = new ModeloTabela(dados, Colunas);
  Tabela.setModel(modelo);
  Tabela.getColumnModel().getColumn(0).setPreferredWidth(65);
  Tabela.getColumnModel().getColumn(0).setResizable(false);
  Tabela.getColumnModel().getColumn(1).setPreferredWidth(245);
  Tabela.getColumnModel().getColumn(1).setResizable(false); 
   Tabela.getColumnModel().getColumn(2).setPreferredWidth(65);
  Tabela.getColumnModel().getColumn(2).setResizable(false);       
  Tabela.setAutoResizeMode(Tabela.AUTO_RESIZE_OFF);
  Tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}

este metodo esta no meu JForm
dentro do meu método preencher tabela é passado como parâmetro a string de pesquisa com o meu banco e nela ja esta embutida o select que uso para fazer a pesquisa
abaixo vai este metodo dentro do botão pesquisar
try {
preencherTabela(“select * from vendas where codigo =’”+pre.getText()+"’"); // aqui esta ele
conecta.rs.first();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro ao se conectar com banco de dados: "+ex.getMessage());
}

e mesmo que eu criasse uma classe Dao em estilo MVC daria erro de imcompatiblidade neste linha

ArrayList listaNova = new classeDAO( pre.getText());

pois o netbeans acusa que classeDao não é do tipo ArrayList

também deu erro nesta linha
this.fireDataChanged();
pois o netbeans reclama que este metodo não existe e pede para ser criado

lembrando que meu metodo preencherTabela não está numa classe especifica, mas esta no meu JForm e eu apenas o chamei para dentro do botão, gostaria de resolver isso no propio JForm sem ter que criar uma classe dao onde ficariam todos os metodos pesquisar, salvar etc

obrigado pela boa vontade e ajuda

Persão errei o nome do metodo, falei this.fireDataChanged(); mas era this.fireTableDataChanged()
Vamos la cara vou tentar explicar de forma diferente cada linha q mandei e no final deixei sua classe ModeloTabela funcionando bonitinho.

ModeloTabela table = (ModeloTabela) jTable1.getModel(); // pega o modelo sem desconstruir

Perceba que essa linha n faz o new ModeloTabela(dados,colunas), isso pq toda vez q vc faz o new, ela cria uma nova (obvio), sendo assim, o antigo é perdido, e o que queremos aqui é manter os dados do antigo e n sobrescreve-lo.

ArrayList listaNova = new classeDAO( jTextfield1.getText()); // o textfield é onde vc pega o texto, a     classeDAO é onde vc pega faz o select do banco

Ja que vc n usa classeDAO para pegar os valores, ali vc fara, seja la como esteja fazendo, o select com retorno do tipo ArrayList.

table.addList(listaNova); //adiciona a listaNova na tabela

Essa linha é responsável por adicionar a nova matriz de dados, sem segredo.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Clemerson
 */
public class ModeloTabela extends AbstractTableModel {

    private ArrayList linhas = null;
    private String[] colunas = null;

    public ModeloTabela(ArrayList lin, String[] col) {
        setLinhas(lin);
        setColunas(col);
    }

    public ArrayList getLinhas() {
        return linhas;
    }

    public void setLinhas(ArrayList dados) {
        linhas = dados;
    }

    public String[] getColunas() {
        return colunas;
    }

    public void setColunas(String[] nomes) {
        colunas = nomes;
    }

    public int getColumnCount() {
        return colunas.length;
    }

    public int getRowCount() {
        return linhas.size();
    }

    public String getColumnName(int numCol) {
        return colunas[numCol];
    }

    public Object getValueAt(int numLin, int numCol) {
        Object[] linha = (Object[]) getLinhas().get(numLin);
        return linha[numCol];
    }


    // aqui esta a real sugestão

    public void addLista(ArrayList lista) {
        for (Object objeto : lista) {
            this.linhas.add(objeto); // e aqui da erro no add
        }
        this.fireTableDataChanged();
    }
}

Lembrando q se vc usar o new no Modelo da Tabela lógico q dara um erro, pois a variável linhas n estará inicializada

quero lembrar que eu tenho a classe ModeloTabela acima , e eu instancio esta classe dentro de um método chamado preencher tabela que eu ja postei ai é neste metodo que dou o setModel(modelo), e este metodo recebe como parametro uma string sql , desse jeito
preencherTabela(“select * from vendas where codigo =’”+pre.getText()+"’"); esse metodo com essa string eu coloco dentro de um botão pra pesquisar e da certo.
meu metodo preencher tabela esta assim

public void preencherTabela(String sql){
ArrayList dados = new ArrayList();
String[] Colunas = new String[]{“CODIGO”,“NOME”,“PRECO”};
conecta.executaSql(sql);
try{
conecta.rs.first();
do{

dados.add(new Object[]{conecta.rs.getInt(“codigo”),conecta.rs.getString(“nome”),conecta.rs.getDouble(“preco”)}); // veja que aqui estou trazendo os dados do banco

     }while(conecta.rs.next());
    
}catch(SQLException ex){   
  } 

ModeloTabela modelo = new ModeloTabela(dados, Colunas); // aqui eu subistitui pela linha abaixo
ModeloTabela modelo = (ModeloTabela) Tabela.getModel(); // aqui esta sua linha sugerida, mas onde
encaixo estas outras linhas que voce disse -> ArrayList listaNova = new classeDAO( jTextfield1.getText()); // no meu caso ele não aceita textfeld como parametro, ele reclama que textfield não é do tipo array e também o array que construi no inicio do metodo não poderiamos usa-lo ao inves de criar outro array ???
modelo.addLista(listaNova);

Tabela.setModel(modelo);
  Tabela.getColumnModel().getColumn(0).setPreferredWidth(65);
  Tabela.getColumnModel().getColumn(0).setResizable(false);
  Tabela.getColumnModel().getColumn(1).setPreferredWidth(245);
  Tabela.getColumnModel().getColumn(1).setResizable(false); 
   Tabela.getColumnModel().getColumn(2).setPreferredWidth(65);
  Tabela.getColumnModel().getColumn(2).setResizable(false);       
  Tabela.setAutoResizeMode(Tabela.AUTO_RESIZE_OFF);
  Tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);   
}

Se vc olhou a classe que passei,viu que coloquei o método de addList da forma correta que informei nas respostas passadas, de qualquer forma, essa linha…

ArrayList listaNova = new classeDAO( jTextfield1.getText());

…só fará sentido se o método construtor da classeDAO recebesse String como parâmetro, logo, dependendo da sua implementação, não há motivos para utiliza-lo, serviu apenas como exemplo.

Cara quanto a seu método de preencherTabela(), espero q ele esteja em uma classe separada, pois é ideal que vc divida o seu código em camada para melhor controle de seu código e permite reutilização do mesmo. SUPONDO que vc esteja implementando dessa forma, vc deve possuir uma classe que controla a comunicação com o banco e/ou o select do banco.

Primeiro de tudo: Mude seu método preencher tabela de void para ArrayList (informando no seu método que terá a lista como valor de retorno).

public class ClasseDAO {

private final Connection conn; //Pelo menos deveria ser assim

public ClasseDAO(){
     conn = ClasseConexão().getConexao();
}


public ArrayList selectVendas(int codigo){
     ArrayList lista = new ArrayList();
     try{
     String selectSQL = "select * from vendas where codigo =?"; // Perceba o ?
     PreparedStatement preparedStatement = conn.prepareStatement(selectSQL);
     preparedStatement.setInt(1,codigo);
     ResultSet rs = preparedStatement.executeQuery(selectSQL);
     while (rs.next()) {
           Object objeto = new Objeto[3];
           objeto[0] = rs.getInt("codigo");
           objeto[1] = rs.getString("nome");
           objeto[2] = rs.getDouble("preco");
           lista.add(objeto);
     }
     }catch(Exception a){
     }
     return lista;
}

}

Esse método fara a pesquisa, agr vc colocara o seguinte código no botão:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {    
     ArrayList listaNova = new classeDAO().selectVendas(Integer.parseInt(jTextField1.getText()));
     ModeloTabela table = (ModeloTabela) jTable1.getModel();
     table.addList(listaNova);
 }

Reveja os métodos de sua aplicação e estude com cuidado cada coisa que te passei, PF n jogue isso direto no código sem entender o que cada coisa faz.

Olá amigo

deu certo de novo, muito obrigado pela dica viu

inté