Preencher Jtable

8 respostas
D

Boa Noite galera!

Eu estou tentando fazer um aplicativo com jtable, que a ideia seria eu fazer lançamentos de despesas de KM.
a ideia é ir colocando o local de saida e chega e esses dados deveria aparecer no jtable em tempo de execução.

Eu estou tentando utilizar o AbstractTableModel com ArrayList. Mas não consigo trazer os dados que estão no banco de dados para o jtable, só consegui fazendo a inserção do valor manualmente.

Eu vou mostrar os code das minhas class:

TableModel

import absProjeto.Produto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author danilo.fernandes
 */
public class ProdutoTableModel extends AbstractTableModel{

    private final int col_nome = 0;
    private final int col_quant = 1;

    private List produtos;

    public ProdutoTableModel(){
        produtos = new ArrayList();
    }
    public ProdutoTableModel(List lista){
        this();
        produtos.addAll(lista);
    }
    public int getRowCount(){
        return produtos.size();
    }
    public int getColumnCount(){
        return 2;
    }
    @Override
    public String getColumnName(int coluna){
        if(coluna == col_nome)
        {
            return "Nome";
        }
 else if(coluna == col_quant)
        {
     return "Quant. Disp";
        }
        return "";
    }
    @Override
    public Class getColumnClass(int colunaIndex){
        if(colunaIndex == col_nome)
        {
            return String.class;
        }
 else if(colunaIndex == col_quant)
        {
     return Integer.class;
        }
        return String.class;
    }
    public Object getValueAt(int LinhaIndex,int colunaIndex)
    {
        if(produtos != null && LinhaIndex >= 0 && LinhaIndex < produtos.size()){

        Produto p = (Produto) produtos.get(LinhaIndex);
        switch(colunaIndex){
            case 0:
                return p.getNome();
            case 1:
                return p.getQuant();

        }

    }
        return null;
       
    }



    public void setValueAt(Object aValue, int linhaIndex, int colunaIndex)
    {
     Produto p = (Produto) produtos.get(linhaIndex);

     if(colunaIndex == col_nome)
     {
         p.setNome(aValue.toString());
     }
 else if(colunaIndex == col_quant)
     {
        p.setQuant(Integer.parseInt(aValue.toString()));
     }
        fireTableDataChanged();
    }
    @Override
    public boolean isCellEditable(int linhaIndex,int colunaIndex)
    {
        return true;
    }

    public void inserir(Produto p){
        produtos.add(p);

        fireTableDataChanged();
    }

    public void excluir(int pos){
        produtos.remove(pos);

        fireTableDataChanged();
    }
    public void excluir(Produto p){
        produtos.remove(p);
        
        fireTableDataChanged();
    }

    public void ordenarPorNome(){
        Collections.sort(produtos,new Comparator<Produto>(){
             public int compare(Produto o1, Produto o2){
                return o1.getNome().compareTo(o2.getNome());
            }
          
        });
        fireTableDataChanged();
    }
    public void ordenarPorQuant(){
        Collections.sort(produtos,new Comparator<Produto>(){
             public int compare(Produto o1, Produto o2){
                return o1.getQuant() - o2.getQuant();
            }
          
        });
        fireTableDataChanged();
    }

    


    public void misturar(){
        Collections.shuffle(produtos);
        fireTableDataChanged();
    }
    public Produto getCliente(int pos){
        if(pos < 0 || pos >= produtos.size()){
            return null;
          }
        return (Produto) produtos.get(pos);
    }
Esse code eu peguei no forum.

e tenho uma class produto com metodos get e set.

a minha class main com a jtable esta limpa basicamento, porque tudo que ja tentei não funciona, então queria saber se vcs poderia passar alguma ideia de como poderia fazer isso.

e eu sei que tem muitos topicos relacionados a isso, mas antes de eu vir aqui abrir outro, eu procurei muito. porque eu quebro a cabeça mto antes de pedir ajuda rsrs.

Desde já agradeço.

8 Respostas

JoaoBluSCBR

O código que você passou está correto.

Eu criei uma classe Main (segue abaixo).

Rodei e nela invento valores de Nome e Quant de produto e beleza tudo é carregado na tabela.

Leia os comentários para ver onde os valores estão sendo carregados.

Você não mandou a tua classe Main então não sei como você está fazendo.

Segue a minha abaixo, se quiser que dê uma olhada na tua, é só postar.

/*
 * Main.java
 *
 * Created on 21/07/2011, 09:02:45
 */
/**
 *
 * @author joao
 */

public class Main extends javax.swing.JFrame {
    
    //Aqui eu já inicializo o model, sem a lista.
    ProdutoTableModel model = new ProdutoTableModel();

    public Main() {
        
        //Aqui eu crio os produtos e acrescento na lista lá do model
        //Veja que nem tenho uma lista aqui, acrescento direto lá.
        for(int i=0; i<5; i++){
            absProjeto.Produto p = new absProjeto.Produto();
            p.setNome(new String("Produto " + i));
            p.setQuant((i+1)*13);
            model.addProdutoLista(p);            
        }
        
        //Vai inicializar o table
        initComponents(); 
        
        //Apenas para teste de acrescimo de um produto depois
        //da inicializacao. 
        absProjeto.Produto p = new absProjeto.Produto();
        p.setNome(new String("Produto 99"));
        p.setQuant(888);
        model.addProdutoLista(p);            
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        //Aqui o table já recebe o model
        jTable1.setModel(model);
        
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(26, 26, 26)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 566, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(37, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(22, 22, 22)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(31, Short.MAX_VALUE))
        );

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
}

Tem a ver com a forma como você está passando a lista. Provavelmente você está
inicializando tua table antes e a tua passagem da lista está num construtor.

É muito comum se usar Form JFrame e colocar a table visualmente. O código dela já sai montado no initComponents,
e lá mesmo ela é inicializada. Se depois você quiser mudar algo, terá de ser por um método disparado, não pelo construtor
que já foi usado e não será mais.

O úntico método da tua classe que recebe a lista, é esse construtor:

public ProdutoTableModel(List lista){   
        this();   
        produtos.addAll(lista);   
    }

Ele não serve para atualizar a lista depois que a classe já foi inicializada, e vc quer acrescentar um novo produto.

Para o meu funcionar, acrescentei no teu MODEL para você mandar do main um novo produto e ele entrar na lista do model:

public void addProdutoLista(Produto prod){
    produtos.add(prod);
}

Para que você possa acrescentar novos produtos a lista durante o processo.

Não sei por que você optou por carregar a lista toda de uma vez só (addAll), se insistir nisso, lembre que quando
a lista for atualizada e vc quiser carregá-la novamente, terá de primeiro esvaziar a lista que já está no
model, senão ela será duplicada.

JoaoBluSCBR

Só para eu entender e aprender também:

Pra que serve esse this abaixo?

public ProdutoTableModel(List lista) {
        this();
        produtos.addAll(lista);
    }
Nicolas_Fernandes

JoaoBluSCBR:
Só para eu entender e aprender também:

Pra que serve esse this abaixo?

public ProdutoTableModel(List lista) {
        this();
        produtos.addAll(lista);
    }


Com o this();, ele faz a chamada do outro construtor da classe, o qual está instanciando a sua variável produtos para ela não ser nula ao receber os valores. Você pode chamar um construtor através do outros através da chamada do this:

public class Classe {

   public Classe() {

      this("Chamando o construtor abaixo...");
   }

   public Classe(String mensagem) {
   
      this();  // chamando o construtor de cima.
   }
}

Abraços!

Nicolas_Fernandes

Cara, sua lista do BD está vindo preenchida corretamente?
Pelo que vejo, por cima, o modelo da tabela está correto.

JoaoBluSCBR

Obrigado Nicolas

Isso eu realmente não sabia.

Conhecia o super(), o this só usava para diferenciar atributos de parâmetros com nomes iguais
tipo:
[code]

private int tipo;

public void setTipo(int tipo){
this.tipo = tipo;
}

Valeu!

D
Nicolas Fernandes:
Cara, sua lista do BD está vindo preenchida corretamente? Pelo que vejo, por cima, o modelo da tabela está correto.

Na Verdade cara, eu consigo mostrar os dados de outros modo(System.out...)mas em todos as pesquisa que fiz, nao encontrei um jeito de aplicar esses dados em minha jtable.
eu tenho um DAO (peguei o exemplo na internet ) q faz a conexão e consigo manipular legal as informações com ele, mas nao sei utilizar no jtable.

public class DaoPessoa {

    private final String URL = "jdbc:jtds:sqlserver://localhost:1433/SmartCompany",NOME = "sa", SENHA = "abc@123";
    //private final String URL = "jdbc:jtds:sqlserver://192.168.0.2:1433/Develop",NOME = "Smart", SENHA = "smart123";

    private Connection con;
    private Statement comando;
  


    public void apagar(String rg){
        conectar();
        try{
            comando.executeUpdate("DELETE FROM pessoa WHERE rh = '"+ rg +"';");
        }catch(SQLException e){
            imprimeErro("Erro ao Apagar Pessoas",e.getMessage());
        }finally{
            fechar();
        }
    }
//vector<pessoa>
   

    public Vector<Pessoa> buscar(String rg) {
      conectar();
      Vector<Pessoa> resultados = new Vector<Pessoa>();
      ResultSet rs;
      try {
         rs = comando.executeQuery("SELECT * FROM pessoa WHERE rg LIKE '"
               + rg + "%';");
         while (rs.next()) {
            Pessoa temp = new Pessoa();
            // pega todos os atributos da pessoa
            temp.setRg(rs.getString("rg"));
            temp.setNome(rs.getString("nome"));
            temp.setIdade(rs.getInt("idade"));
            temp.setCidade(rs.getString("cidade"));
            temp.setEstado(rs.getString("estado"));
            resultados.add(temp);
         }
         return resultados;
      } catch (SQLException e) {
         imprimeErro("Erro ao buscar pessoa", e.getMessage());
         return null;
      }

   }

    public void insere(Pessoa pessoa){
        conectar();
        try{
            comando.executeUpdate("INSERT INTO pessoa VALUES('"
                    + pessoa.getRg() + "', '"+ pessoa.getNome() + "',"
                    + pessoa.getIdade() + ",'" + pessoa.getCidade() + "','"
                    + pessoa.getEstado() + "')");
            System.out.println("Inserida");

        }catch(SQLException e){
            imprimeErro("Erro ao Inserir Pessoa",e.getMessage());
        }finally{
            fechar();
        }

    }

    public void conectar(){
        try{
            con = Connect.conexao(URL, NOME, SENHA, Connect.SQLServer);
            comando = con.createStatement();
            System.out.println("Conectado");
        }catch(ClassNotFoundException e){
            imprimeErro("Erro ao Carregar Driver",e.getMessage());
        }catch(SQLException e){
            imprimeErro("Erro ao Conectar",e.getMessage());
        }
    }

    private void fechar(){
        try{
            comando.close();
            con.close();
            System.out.println("conexão fechada");
        }catch(SQLException e){
            imprimeErro("Erro ao fechar conexao",e.getMessage());
        }
    }

    private void imprimeErro(String msg,String msgErro){
        JOptionPane.showMessageDialog(null,msg,"Erro Critico",0);
        System.err.println(msg);
        System.out.println(msgErro);
        System.exit(0);
    }

    public void atualizar(Pessoa pessoa) {
      conectar();
      String com = "UPDATE pessoa SET nome = '" + pessoa.getNome()
            + "', idade =" + pessoa.getIdade() + ", cidade = '"
            + pessoa.getCidade() + "', estado ='" + pessoa.getEstado()
            + "' WHERE  rg = '" + pessoa.getRg() + "';";
      System.out.println("Atualizada!");
      try {
         comando.executeUpdate(com);
      } catch (SQLException e) {
         e.printStackTrace();
      } finally {
         fechar();
      }
   }

    public List<Pessoa> listar(){
conectar();
        String sql = "select * from pessoa";
        List<Pessoa> lista = new ArrayList<Pessoa>();

        try{
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            while(rs.next()){
                Pessoa p = new Pessoa();
                p.setRg(rs.getString("rg"));
                p.setNome(rs.getString("nome"));
                //p.setCidade(rs.getString("cidade"));
               // p.setEstado(rs.getString("estado"));
                //p.setIdade(rs.getInt("idade"));
                lista.add(p);
            }
        System.out.println("Listado");
        }catch(Exception ex){
            System.out.println("Erro ao Listar"+ex.getMessage());
        }finally{
            fechar();
        }
        return lista;
    }

  
 

}

Alguem teria um exemplo de como eu poderia preencher esse tablemodel? utilizando o meu DAO ou outra conexão...

Tks

F

Eu implementei um TableModel há pouco tempo atrás.
Meu tópico: http://www.guj.com.br/java/247127-finalizando-implementacao-jtable-resolvido

Tem umas dúvidas que eu tinha e como eu as corrigi. Acho que pode ser útil.

JoaoBluSCBR

O teu TableModel está certo, teu DAO está certo.

Resta saber como está a tua classe que une os dois.

Se você postar o teu Frame onde vai a Table daria para ver se falta algo.

E como postei antes, provavelmente é ali que está o erro pois teu model
só recebia a lista num construtor.

Você chegou a olhar o que postei para adaptar para o seu caso?

Criado 20 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 8
Participantes 4