Pessoal duvida jtable

Ué cara, se a classe que tem no model é a Produto, pq nessas linhas vc usa ProdutoTabela?

Entao a classe que era Produto mudei para ProdutoTabela por que vc falou que nao poderia ser igual

A graça de trabalhar com JTable é justamente pq vc pode trabalhar diretamente com suas classes de negócio.
Não precisa existir uma classe de Produto só para a tabela.

Então, a mesma classe de Produto que você carrega no seu Dao, será a classe de Produto que você utilizará dentro do seu JTable.

A classe ProdutoTabela não precisaria sequer existir.

Vamos ver se eu entendi, eu posso ter as duas classes em uma só

por exemplo a classe produto ter DAO e a Table Model

Mas você não conseguiu identificar o erro?

O que é a classe ProdutoTabela?

Ela não é seu TableModel, e também não é a classe Produto.

Esses métodos, do seu TableModel, deveriam trabalhar com a classe Produto. Não sei o que era a classe ProdutoTabela que estava aqui:

  public void inserir(Produto p) {  
        produtos.add(p);  
        fireTableDataChanged();  
    }  
 
    public void excluir(Produto p) {  
        produtos.remove(p);    
        fireTableDataChanged();  
    }  
  
    public void ordenarPorValor() {  
        //ordena pelo nome  
        Collections.sort(produtos, new Comparator<Produto>() {//esta dando erro aqui no sort  
  
            public int compare(Produto o1, Produto o2) {  
                return o1.getValorDespesa().compareTo(o2.getValorDespesa());  
            }  
        });  
        //avisa que a tabela foi alterada  
        fireTableDataChanged();  
    }  

Eu não sei o que é a classe ProdutoTabela. O que estou dizendo é que dentro do Model, você só precisa trabalhar com a classe que vem do Dao, no caso, Produto.

ProdutoTabela:

public class ProdutoTabela {

    private String despesa;
    private String estabelecimento;
    private String datadespesa;
    private String valordespesa;
    private String formapagamento;
    private String datacheque;
    private String numerocheque;

    public ProdutoTabela() {
    }

    public ProdutoTabela(String despesa,String estabelecimento,String datadespesa,String valordespesa,String formapagamento,String datacheque,String numerocheque) {
        this.despesa = despesa;
        this.estabelecimento = estabelecimento;
        this.datadespesa = datadespesa;
        this.valordespesa = valordespesa;
        this.formapagamento = formapagamento;
        this.datacheque = datacheque;
        this.numerocheque = numerocheque;
    }

    //Gets

    public String getDespesa() {
        return despesa;

}
     public String getEstabelecimento() {
        return estabelecimento;

}
      public String getDataDespesa() {
        return datadespesa;

}
       public String getValorDespesa() {
        return valordespesa;

}
        public String getFormaPagamento() {
        return formapagamento;

}
         public String getDataCheque() {
        return datacheque;

}
          public String getNumeroCheque() {
        return numerocheque;

}
      //Sets

      public void setDespesa(String despesa) {
        this.despesa = despesa;
    }
       public void setEstabelecimento(String estabelecimento) {
        this.estabelecimento = estabelecimento;
    }
        public void setDataDespesa(String datadespesa) {
        this.datadespesa = datadespesa;
    }
         public void setValorDespesa(String valordespesa) {
        this.valordespesa = valordespesa;
    }
          public void setFormaPagamento(String formapagamento) {
        this.formapagamento = formapagamento;
    }
           public void setDataCheque(String datacheque) {
        this.datacheque = datacheque;
    }
            public void setNumeroCheque(String numerocheque) {
        this.numerocheque = numerocheque;
    }

}

Pacote Produto do banco

package model;

public class Produto {
   private String despesa;
   private String estabelecimento;
   private String datadadespesa;
   private String valordadespesa;
   private String formadepagamento;
   private String datacheque;
   private String numerocheque;
   private String mes;


   public void setDespesa(String despesa) {
      this.despesa = despesa;
   }
   public void setEstabelecimento(String estabelecimento) {
      this.estabelecimento = estabelecimento;
   }
   public void setDatadaDespesa(String datadadespesa) {
      this.datadadespesa = datadadespesa;
   }
   public void setValordaDespesa(String valordadespesa) {
      this.valordadespesa = valordadespesa;
   }
   public void setFormadePagamento(String formadepagamento) {
      this.formadepagamento = formadepagamento;
   }
   public void setDataCheque(String datacheque) {
      this.datacheque = datacheque;
   }
   public void setNumeroCheque(String numerocheque) {
      this.numerocheque = numerocheque;
   }
   public void setMes(String mes) {
      this.mes = mes;
   }


   public String getDespesa() {
      return this.despesa;
   }
   public String getEstabelecimento() {
      return this.estabelecimento;
   }
   public String getDatadaDespesa() {
      return this.datadadespesa;
   }
   public String getValordaDespesa() {
      return this.valordadespesa;
   }
   public String getFormadePagamento() {
      return this.formadepagamento;
   }
   public String getDataCheque() {
      return this.datacheque;
   }
    public String getNumeroCheque() {
      return this.numerocheque;
   }
    public String getMes() {
      return this.mes;
   }
}

Não sei se é a mesma coisa

Por que existem 2 classes idênticas? Simplesmente apague a ProdutoTabela e trabalhe apenas com a Produto.

Outra dúvida, pq dentro das suas classe só tem Strings?
Os valores não deveriam ser doubles, as datas não deveriam ser Calendars?

Vini vou trabalhar, mas obrigado pela sua atenção vou refazer meu codigo, logo mais entro em contato

obrigado

Então eu como estou aprendendo estou trabalhando com access, sempre da erro nao cadastra no banco

nao sei o que é

Olha, usar AbstractTableModel é bem simples, eu também como você usei bastante DefaultTableModel até ir para o Abstract e hoje uso models para JTable, JComboBox e JList

A idéia do AbstractTableModel é seguir o modelo do Bean(POJO) exibindo/alterando o que vc precisa. Veja, um exemplo simples

public class Usuarios{
       // Bean(POJO) de Usuarios
       private Long id;
       private String usuario;
       private String senha;

       public Usuarios(){
       }
        //set e get
}


public class UsuariosDAO{
       // DAO de Usuarios
       private Connection con;
       
       public UsuariosDAO(){
           this.con = ConectaMySQL.getConnection();
       }
 
       public List<Usuarios> getUsuarios(){
               List<Usuarios> lista = new ArrayList<Usuarios>();
               PreparedStatement stm = this.con.prepareStatement("SELECT * FROM usuarios");
               ResultSet rs = stm.executeQuery();
               while(rs.next()){
                        Usuarios u = new Usuarios();
                        u.setId(rs.getLong("idUsuario"));
                        u.setUsuario(rs.getString("usuario"));
                        lista.add(u);
               }  
                rs.close();
                stm.close();
                return lista;
       }
}

public class UsuariosTableModel extends AbstractTableModel{
       // TableModel de Usuarios
       private List<Usuarios> listaUsuarios;
       private String[] colunas = {"Id", "Usuario"};

       public UsuariosTableModel(){
             listaUsuarios = new ArrayList<Usuarios>();
       }

       public UsuariosTableModel(List<Usuarios> listaU){
             this();
             listaUsuarios.addAll(listaU);
       } 

       public int getRowCount() {    
        return this.listaUsuarios.size();
    }

    @Override
    public int getColumnCount() {
        return this.listaUsuarios.length;
    }

     public String getColumnName(int column){        
        if(colunas[column] == "Id"){
            return "Id";
        }else if(colunas[column] == "Usuario"){            
            return "Usuario";
        }
        return new String();
    }

     public Class getColumnClass(int column){         
         if(colunas[column] == "Id"){
             return Long.class;
         }else if(colunas[column] == "Usuario"){
            return String.class;
         }
        return String.class;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {   
            Usuarios u = this.listaUsuarios.get(rowIndex);
            switch(columnIndex){
                case 0: return u.getId();
                case 1: return u.getUsuario();                    
                default: return new String();
   }                   


}



public class ExibeUsuarios extends JFrame{
      //Exibindo os usuarios na JTable.
      private UsuariosTableModel model;
      private JTable tabelaUsuarios;

      public ExibeUsuarios(){
           List<Usuarios> lista = new UsuariosDAO.getUsuarios();
           model = new UsuariosTableModel(lista);
           tabelaUsuarios = new JTable();
           tabelaUsuarios.setModel(model);

      }

}

Basicamente é isto, voce pode implementar os metodos como setValueAt etc…Para saber mais basta vc acessar a classe AbstractTableModel e ver os metodos q ela implementa e reescreve-los.

t+ e boa sorte.

Fernando então é só eu adaptar este codigo no meu table model

Vini e Fernando vou fazer o que voceis me pediram e vou readaptar meu codigo reescrever, mas logo mais estarei aqui para encher o saco de voceis rsrsrs, agora tenho que ir

Muito obrigado mesmo pessoal

Pessoal estou de volta Vini agora com outra duvida voce estava certo eu fui noob em relação ao erro, era classe duplicada, apaguei produtotabela, ai já era, Obrigado, mas agora estou com a duvida de poder alterar

Codigo alterar classe Dao:

 public void atualizar(Produto despesa) {
      conectar();
      String com = "UPDATE Produto SET " +
                   "despesa= '" + despesa.getDespesa() + "'," +
   	   	   "estabelecimento= '" + despesa.getEstabelecimento() + "'," +
   	   	   "datadadespesa='" + despesa.getDatadaDespesa() + "'," +
   	   	   "valordadespesa='" + despesa.getValordaDespesa() + "'," +
   	   	   "formadepagamento='" + despesa.getFormadePagamento() + "'," +
                   "datacheque='" + despesa.getDataCheque() + "' " +
                   "numerocheque='" + despesa.getNumeroCheque() + "' " +
                   "mes='" + despesa.getMes() + "' " +
   	   	   " WHERE despesa = '" + despesa.getDespesa() + "'";
      try {
         comando.executeUpdate(com); 
         JOptionPane.showMessageDialog(null,"Operação realizada com sucesso!");
      } catch (SQLException e){
         e.printStackTrace();
      } finally {
         fechar();
      }
   }

o restante do codigo da tabela voce ja sabe.

Obrigado, agora estou me adaptando a tablemodel bem melhor sem comparação

TableModel sem comparação

[quote=alucardmaas]Pessoal estou de volta Vini agora com outra duvida voce estava certo eu fui noob em relação ao erro, era classe duplicada, apaguei produtotabela, ai já era, Obrigado, mas agora estou com a duvida de poder alterar

Codigo alterar classe Dao:

 public void atualizar(Produto despesa) {
      conectar();
      String com = "UPDATE Produto SET " +
                   "despesa= '" + despesa.getDespesa() + "'," +
   	   	   "estabelecimento= '" + despesa.getEstabelecimento() + "'," +
   	   	   "datadadespesa='" + despesa.getDatadaDespesa() + "'," +
   	   	   "valordadespesa='" + despesa.getValordaDespesa() + "'," +
   	   	   "formadepagamento='" + despesa.getFormadePagamento() + "'," +
                   "datacheque='" + despesa.getDataCheque() + "' " +
                   "numerocheque='" + despesa.getNumeroCheque() + "' " +
                   "mes='" + despesa.getMes() + "' " +
   	   	   " WHERE despesa = '" + despesa.getDespesa() + "'";
      try {
         comando.executeUpdate(com); 
         JOptionPane.showMessageDialog(null,"Operação realizada com sucesso!");
      } catch (SQLException e){
         e.printStackTrace();
      } finally {
         fechar();
      }
   }

o restante do codigo da tabela voce ja sabe.

Obrigado, agora estou me adaptando a tablemodel bem melhor sem comparação
[/quote]

Primeira coisa é não concatenar seus SQL, use PreparedStatement veja.

public void updateUsuario(Usuarios u){
PreparedStatement stm = con.prepareStatement("UPDATE usuarios SET nome = ?, login = ? WHERE id = ?");
stm.setString(1, u.getNome());
stm.setString(2, u.getLogin());
stm.setLong(3, u.getId());
stm.executeUpdate();
}

Segunda coisa, siga esse link para Update e Delete dos seus objetos de persistencia: http://www.guj.com.br/java/260577-abstracttablemodel-removendo-registro-do-bd-

t+ e boa sorte.

Fernando eu não quero mudar meu código da table model, quero continuar usando aquele, tudo bem que mudo a classe Dao que achei bem melhor, mas eu quero trabalhar com pacote fica mais organizado, então como eu adaptaria meu código Dao com TableModel na classe principal, já consegui exibir

Código Exibir:

 public void PreencherTabela(){

                List<Produto> lista = daoProduto.buscarTodos();
                ProdutoTableModel tabela = new ProdutoTableModel(lista);
                tblBanco.setModel(tabela);

            }

Agora se possível quero uma solução para update a também já consegui excluir:


private void btExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                          

        if(evt.getSource()==btExcluir){

          int row = tblBanco.getSelectedRow();
                if (row != -1) {
                    int mod = tblBanco.getColumn("Despesa").getModelIndex();
                    int col = tblBanco.convertColumnIndexToView(mod);
                    String id =  (String) tblBanco.getValueAt(row, col);
                    daoProduto.apagar(id);

                } else {
                    // mostrar advertência?
                }


        }
        PreencherTabela();
    }                              

Por favor uma solução