Somando Valores em uma JTable

23 respostas
C

Ola
Tenho uma jtable com varias colunas, sendo que em uma delas tem valores, como faço quando eu abro a jtable ela me
da a somatoria de todos os valores dessa coluna em um JTextField.

23 Respostas

vinilima

Como você popula os dados nessa JTable?

mauricioadl

usa modelo para tabelas, nunca se deve usar tabelas sem modelos e sempre evitar de usar DefaultTableModel.
Depois do seu modelo implementado, vc faz um metodo que percorre a lista e retorna a somatoria deles.

veja o artigo ensinando usar modelo:
http://www.guj.com.br/articles/147

S

você pode fazer um for percorrer as linhas da sua JTable e vai somando esta coluna

isso pode ser implementado logo após o algorítimo que preenche a tabela

C

Primeiramente estou fazendo um sistema de contas pagar e receber. Esses dados vem do banco de dados, aonde já esta gravado todos os dados, inclusive os valores. No menu principal tenho um botom relatorios, quando cicko nele, ja me abre a tabela com todos os dados, ai sim é que eu gostaria que a coluna aonde esta os valores fossem somados, me dando o resultado em uma JTextFiel, como por EX: um valor total a pagar

codigo | fornecedor | posição conta | valor
1 | aaaaa | pagar | 100,00
2 | bbbb | pagar | 100,00

[size=18]total a pagar 200,00 [/size]=> é aqui que gostaria de ter a soma total

vinilima
um exemplo simples:
// sua classe que tem os atributos que serão populados na JTable
public class Titulo {
    // esse é o atributo base pra cálculos
    private double valor;
    
    // outros atributos, getters e setters
}
// sua classe view
public class TitulosView extends JFrame{
    private JTable tabela;
    private JLabel valorTotal;  // esse é o label com o total somado
    private TituloDAO dao;

    // método que preenche a tabela
    public void preencheTabela() {
        List<Titulo> dados = dao.getAll();
        
        // aqui ficaria a parte de setar os dados na tabela
        for(Titulo t : dados) {
            /// seta os dados aqui
        }

        // aqui fica o cálculo
        double total = 0.0;
        for(Titulo t : dados) {
            total += t.getValor();
        }

        // aqui seta o total no JLabel
        valorTotal.setText( String.valueOf(total) );

    }
}
Esse é um exemplo bem simples mas dá uma idéia de como você pode resolver...
Nicolas_Fernandes
mauricioadl:
usa modelo para tabelas, nunca se deve usar tabelas sem modelos e sempre evitar de usar DefaultTableModel. Depois do seu modelo implementado, vc faz um metodo que percorre a lista e retorna a somatoria deles.

veja o artigo ensinando usar modelo:
http://www.guj.com.br/articles/147

Reforçando o tópico do maurício! Crie seu próprio modelo. A partir daí, você cria um método chamado calcularSomatoriaDeValores, que retorna a somatória da coleção de seu modelo:

public double recuperarSomatoriaDeValores() {

    double somatoria = 0.0;
    for (Classe objetoDaClasse : suaColecao) {
        somatoria = somatoria + objetoDaClasse.getValor();    
    }
    return somatoria;
}

E voilà, tá pronto!
Abraços!

C

Estou meio perdido, segue codigo de quando abro minha tabela, onde eu coloco isso que voçe escreveu

public void preencher_jtable()

{

DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer();

DefaultTableCellRenderer centro = new DefaultTableCellRenderer();

DefaultTableCellRenderer direita = new DefaultTableCellRenderer();
esquerda.setHorizontalAlignment(SwingConstants.LEFT);

centro.setHorizontalAlignment(SwingConstants.CENTER);

direita.setHorizontalAlignment(SwingConstants.RIGHT);
//CODIGO

jTable.getColumnModel().getColumn(0).setCellRenderer(centro);

//DATAVENCIMENTO

jTable.getColumnModel().getColumn(1).setCellRenderer(centro);

//FORNECEDOR

jTable.getColumnModel().getColumn(2).setCellRenderer(esquerda);

//VALOR

jTable.getColumnModel().getColumn(3).setCellRenderer(direita);

//PISIÇÃO CONTA

jTable.getColumnModel().getColumn(4).setCellRenderer(centro);

//CODIGO DE BARRAS

jTable.getColumnModel().getColumn(5).setCellRenderer(esquerda);
//CODIGO

jTable.getColumnModel().getColumn(0).setPreferredWidth(10);

//DATA VENCIMENTO

jTable.getColumnModel().getColumn(1).setPreferredWidth(20);

//FORNECEDOR

jTable.getColumnModel().getColumn(2).setPreferredWidth(200);

//VALOR

jTable.getColumnModel().getColumn(3).setPreferredWidth(30);

//POSIÇÃO CONTA

jTable.getColumnModel().getColumn(4).setPreferredWidth(30);

//CODIGO DE BARRAS

jTable.getColumnModel().getColumn(5).setPreferredWidth(200);
DefaultTableModel modelo = (DefaultTableModel)jTable.getModel();

modelo.setNumRows(0);

try

{

while(contas.resultset.next()
)

modelo.addRow(new Object[]

{

contas.resultset.getString(codigo),

contas.resultset.getString(datavencimento),

contas.resultset.getString(fornecedor),

contas.resultset.getString(valor),

contas.resultset.getString(posicaoconta),

contas.resultset.getString(codigobarras),
}

);

}

catch(SQLException erro)

{

}

}
Nicolas_Fernandes

Crie seu próprio modelo para controle da sua JTable [vide link na minha assinatura].
A partir daí você vai entender o código que eu coloquei no post anterior.

mauricioadl

Usar JTable e não usar Modelo é mais feio do que brigar com a mãe por causa de mistura.

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

C
vinilima:
um exemplo simples:
// sua classe que tem os atributos que serão populados na JTable
public class Titulo {
    // esse é o atributo base pra cálculos
    private double valor;
    
    // outros atributos, getters e setters
}
// sua classe view
public class TitulosView extends JFrame{
    private JTable tabela;
    private JLabel valorTotal;  // esse é o label com o total somado
    private TituloDAO dao;

    // método que preenche a tabela
    public void preencheTabela() {
        List<Titulo> dados = dao.getAll();
        
        // aqui ficaria a parte de setar os dados na tabela
        for(Titulo t : dados) {
            /// seta os dados aqui
        }

        // aqui fica o cálculo
        double total = 0.0;
        for(Titulo t : dados) {
            total += t.getValor();
        }

        // aqui seta o total no JLabel
        valorTotal.setText( String.valueOf(total) );

    }
}
Esse é um exemplo bem simples mas dá uma idéia de como você pode resolver...

Estou meio perdido, segue codigo de quando abro minha tabela, onde eu coloco isso que voçe escreveu

public void preencher_jtable()
{
DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer();
DefaultTableCellRenderer centro = new DefaultTableCellRenderer();
DefaultTableCellRenderer direita = new DefaultTableCellRenderer();

esquerda.setHorizontalAlignment(SwingConstants.LEFT);
centro.setHorizontalAlignment(SwingConstants.CENTER);
direita.setHorizontalAlignment(SwingConstants.RIGHT);

//CODIGO
jTable.getColumnModel().getColumn(0).setCellRenderer(centro);
//DATAVENCIMENTO
jTable.getColumnModel().getColumn(1).setCellRenderer(centro);
//FORNECEDOR
jTable.getColumnModel().getColumn(2).setCellRenderer(esquerda);
//VALOR
jTable.getColumnModel().getColumn(3).setCellRenderer(direita);
//PISIÇÃO CONTA
jTable.getColumnModel().getColumn(4).setCellRenderer(centro);
//CODIGO DE BARRAS
jTable.getColumnModel().getColumn(5).setCellRenderer(esquerda);

//CODIGO
jTable.getColumnModel().getColumn(0).setPreferredWidth(10);
//DATA VENCIMENTO
jTable.getColumnModel().getColumn(1).setPreferredWidth(20);
//FORNECEDOR
jTable.getColumnModel().getColumn(2).setPreferredWidth(200);
//VALOR
jTable.getColumnModel().getColumn(3).setPreferredWidth(30);
//POSIÇÃO CONTA
jTable.getColumnModel().getColumn(4).setPreferredWidth(30);
//CODIGO DE BARRAS
jTable.getColumnModel().getColumn(5).setPreferredWidth(200);

DefaultTableModel modelo = (DefaultTableModel)jTable.getModel();
modelo.setNumRows(0);
try
{
while(contas.resultset.next()

)
modelo.addRow(new Object[]
{
contas.resultset.getString("codigo"),
contas.resultset.getString("datavencimento"),
contas.resultset.getString("fornecedor"),
contas.resultset.getString("valor"),
contas.resultset.getString("posicaoconta"),
contas.resultset.getString("codigobarras"),

}
);
}
catch(SQLException erro)
{
}
}

vinilima

CRCJ o meu exemplo foi bem simples apenas pra demonstrar. Use formatação de código pra melhorar o entendimento do seu. Use as tags [ code] e [/code ] sem os espaços dentro dos colchetes.

[ code]
seu codigo aqui
[ /code]

vinilima
CRCJ:
Estou meio perdido, segue codigo de quando abro minha tabela, onde eu coloco isso que voçe escreveu
public void preencher_jtable() { 
    DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer(); 
    DefaultTableCellRenderer centro = new DefaultTableCellRenderer(); 
    DefaultTableCellRenderer direita = new DefaultTableCellRenderer(); 

    esquerda.setHorizontalAlignment(SwingConstants.LEFT); 
    centro.setHorizontalAlignment(SwingConstants.CENTER); 
    direita.setHorizontalAlignment(SwingConstants.RIGHT); 

    //CODIGO 
    jTable.getColumnModel().getColumn(0).setCellRenderer(centro); 
    //DATAVENCIMENTO 
    jTable.getColumnModel().getColumn(1).setCellRenderer(centro); 
    //FORNECEDOR 
    jTable.getColumnModel().getColumn(2).setCellRenderer(esquerda); 
    //VALOR 
    jTable.getColumnModel().getColumn(3).setCellRenderer(direita); 
    //PISIÇÃO CONTA 
    jTable.getColumnModel().getColumn(4).setCellRenderer(centro); 
    //CODIGO DE BARRAS 
    jTable.getColumnModel().getColumn(5).setCellRenderer(esquerda); 

    //CODIGO 
    jTable.getColumnModel().getColumn(0).setPreferredWidth(10); 
    //DATA VENCIMENTO 
    jTable.getColumnModel().getColumn(1).setPreferredWidth(20); 
    //FORNECEDOR 
    jTable.getColumnModel().getColumn(2).setPreferredWidth(200); 
    //VALOR 
    jTable.getColumnModel().getColumn(3).setPreferredWidth(30); 
    //POSIÇÃO CONTA 
    jTable.getColumnModel().getColumn(4).setPreferredWidth(30); 
    //CODIGO DE BARRAS 
    jTable.getColumnModel().getColumn(5).setPreferredWidth(200); 

    // aqui pode ficar a variável total
    double total = 0.0;

    DefaultTableModel modelo = (DefaultTableModel)jTable.getModel(); 
    modelo.setNumRows(0); 
    try { 
        while(contas.resultset.next()) {
            modelo.addRow(new Object[] 
                { 
                    contas.resultset.getString("codigo"), 
                    contas.resultset.getString("datavencimento"), 
                    contas.resultset.getString("fornecedor"), 
                    contas.resultset.getString("valor"), 
                    contas.resultset.getString("posicaoconta"), 
                    contas.resultset.getString("codigobarras"), 
                } 
            );

            // aqui você soma
            total = total + Double.parseDouble(contas.resultset.getString("valor"));
        }

        // aqui você seta o total no jLabel total a pagar
        suaLabel.setText(String.valueOf(total));
 
    } 
    catch(SQLException erro) { 
    } 
}
lucasmm

Bom fera, fiz um exemplo em cima do seu codigo, espero q ajude.

Primeiro criei um bean chamado Valores
class Valores {
    private String codigo;
    private String datavencimento;
    private String fornecedor;
    private float valor;
    private String posicaoconta;
    private String codigobarras;
    //Coloque os getters e setters
}

Depois vamos criar uma AbstractTableModel, para a sua JTable

class dadosTabela extends AbstractTableModel {

    List<Valores> listaValores;

    public dadosTabela() {
        listaValores = new ArrayList<Valores>();
    }

    public dadosTabela(List<Valores> listaValores) {
        this.listaValores = listaValores;
    }

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

    public int getColumnCount() {
        return 6;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Valores valores = listaValores.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return valores.getCodigo();
            case 1:
                return valores.getDatavencimento();
            case 2:
                return valores.getFornecedor();
            case 3:
                return valores.getValor();
            case 4:
                return valores.getPosicaoconta();
            case 5:
                return valores.getCodigobarras();
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int column) {
        switch (column) {
            case 0:
                return "CODIGO";
            case 1:
                return "DATA VENCIMENTO";
            case 2:
                return "FORNECEDOR";
            case 3:
                return "VALOR";
            case 4:
                return "POSICAO CONTA";
            case 5:
                return "CODIGO BARRAS";
            default:
                return "";
        }
    }
}
Criei uma classe Dao, bom eu ñ sei como vc faz a sua conexao mas segue o exemplo para a utilização
class DAO {

    public List<Valores> getContas() {
        List<Valores> listaValores = new ArrayList<Valores>();
        /*
         * Adicione o seu codigo da sua busca
         * O resultado do resultSet vc coloca no List assim + -
         * 
         * while(contas.resultset.hasNext()){
         *     Valores v = new Valores();
         *     v.setFornecedor(contas.resultset.getString("fornecedor"));
         *    //E assim sucessivamente ...
         *     listaValores.add(v);
         * }
         */
        return listaValores;
    }
}

Agora o pulo do gato kkkk

class Test {

    public void addModel(dadosTabela model, JTable table, List<Valores> valores, DAO dao) {
        valores = dao.getContas(); //Armazena os valores na list
        model = new dadosTabela(valores); // Cria o modelo de acordo com a lista de valores
        table.setModel(model); //Passa o modelo para sua lista
    }

    public float contaValores(List<Valores> listvalores) {
        float valorTotal = 0;
        for (Valores valores : listvalores) {
            valorTotal += valores.getValor();
        }
        return valorTotal;
    }
}

Bom o processo é bem simples, vc cria um bean, que vai conter os valores da JTable, cria um List de acordo com o bean, depois configure a busca de dados e passe esses dados para o List, com isso tudo, adicione no AbstractTableModel (dadosTabela) o List, depois adicione esse model no seu JTable.

Espero q ajude :wink:

C
vinilima:
CRCJ:
Estou meio perdido, segue codigo de quando abro minha tabela, onde eu coloco isso que voçe escreveu
public void preencher_jtable() { 
    DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer(); 
    DefaultTableCellRenderer centro = new DefaultTableCellRenderer(); 
    DefaultTableCellRenderer direita = new DefaultTableCellRenderer(); 

    esquerda.setHorizontalAlignment(SwingConstants.LEFT); 
    centro.setHorizontalAlignment(SwingConstants.CENTER); 
    direita.setHorizontalAlignment(SwingConstants.RIGHT); 

    //CODIGO 
    jTable.getColumnModel().getColumn(0).setCellRenderer(centro); 
    //DATAVENCIMENTO 
    jTable.getColumnModel().getColumn(1).setCellRenderer(centro); 
    //FORNECEDOR 
    jTable.getColumnModel().getColumn(2).setCellRenderer(esquerda); 
    //VALOR 
    jTable.getColumnModel().getColumn(3).setCellRenderer(direita); 
    //PISIÇÃO CONTA 
    jTable.getColumnModel().getColumn(4).setCellRenderer(centro); 
    //CODIGO DE BARRAS 
    jTable.getColumnModel().getColumn(5).setCellRenderer(esquerda); 

    //CODIGO 
    jTable.getColumnModel().getColumn(0).setPreferredWidth(10); 
    //DATA VENCIMENTO 
    jTable.getColumnModel().getColumn(1).setPreferredWidth(20); 
    //FORNECEDOR 
    jTable.getColumnModel().getColumn(2).setPreferredWidth(200); 
    //VALOR 
    jTable.getColumnModel().getColumn(3).setPreferredWidth(30); 
    //POSIÇÃO CONTA 
    jTable.getColumnModel().getColumn(4).setPreferredWidth(30); 
    //CODIGO DE BARRAS 
    jTable.getColumnModel().getColumn(5).setPreferredWidth(200); 

    // aqui pode ficar a variável total
    double total = 0.0;

    DefaultTableModel modelo = (DefaultTableModel)jTable.getModel(); 
    modelo.setNumRows(0); 
    try { 
        while(contas.resultset.next()) {
            modelo.addRow(new Object[] 
                { 
                    contas.resultset.getString("codigo"), 
                    contas.resultset.getString("datavencimento"), 
                    contas.resultset.getString("fornecedor"), 
                    contas.resultset.getString("valor"), 
                    contas.resultset.getString("posicaoconta"), 
                    contas.resultset.getString("codigobarras"), 
                } 
            );

            // aqui você soma
            total = total + Double.parseDouble(contas.resultset.getString("valor"));
        }

        // aqui você seta o total no jLabel total a pagar
        suaLabel.setText(String.valueOf(total));
 
    } 
    catch(SQLException erro) { 
    } 
}

Obrigado, mas não funcionou

vinilima

Deu erro? Por que não funcionou?

C

Fiz exatamente como voçe fez no codigo corrigido, mas quando eu abro a jTable, ela não me mostra nenhum cadastro
e na jtextfield me mostra 0.0, tentei colocar em todos os lugares, mas quando me abre todos os cadastros, continua me mostrando na
jtextfied 0.0. ou seja de nenhum modo ela não me da a soma. Como faço para lhe mandar o projeto completo, talvez consiga. Já pesquisei em quase tudo na internet, mas não achei nada parecido

vinilima

Fiz exatamente como voce fez no codigo corrigido, mas quando eu abro a jTable, ela não me mostra nenhum cadastro
e na jtextfield me mostra 0.0, tentei colocar em todos os lugares, mas quando me abre todos os cadastros, continua me mostrando na
jtextfied 0.0. ou seja de nenhum modo ela não me da a soma. Como faço para lhe mandar o projeto completo, talvez consiga. Já pesquisei em quase tudo na internet, mas não achei nada parecido
Ele mostrava dados na jTable antes de vc alterar o código que enviei? Faz assim, compacta o projeto, envia pra algum site tipo megaupload e me mande o link via mensagem privada (MP).

vinilima

Rpz, não consegui colocar o BD Access aqui pra rodar, dá erro no ODBC, não sei pq, tenho o Win 7 Ultimate 64bit.
Me diga uma coisa, por que os campos de valor são texto no banco de dados? Esse é o problema, os seus campos de valores deveriam ser guardados no banco como decimal e não texto.
Quando você chama o código contas.resultset.getString(“valor”) ele está retornando valores como 2.750,50, nesse caso, o método Double.parseDouble que lhe indiquei num post anterior nunca iria funcionar.
Outra pergunta: você não criou nenhuma classe modelo no seu sistema por qual motivo mesmo?

C

vinilima:
Rpz, não consegui colocar o BD Access aqui pra rodar, dá erro no ODBC, não sei pq, tenho o Win 7 Ultimate 64bit.
Me diga uma coisa, por que os campos de valor são texto no banco de dados? Esse é o problema, os seus campos de valores deveriam ser guardados no banco como decimal e não texto.
Quando você chama o código contas.resultset.getString(“valor”) ele está retornando valores como 2.750,50, nesse caso, o método Double.parseDouble que lhe indiquei num post anterior nunca iria funcionar.
Outra pergunta: você não criou nenhuma classe modelo no seu sistema por qual motivo mesmo?

Se eu colocar como decimal, quando abro o cadastro ou o relatório, ele me mostra 275050.000, usando texto ele me mostra 2.750,50.
fiz uma mascara formatovalor e assim funciona. Sou um autodidata aprendi sozinho, por isso tenho dificuldades. Eu uso o Access 2002/
2003, mas roda também no 2007.

vinilima

É rpz, com seu modelo ai de valor em campo texto o trabalho é braçal. Você vai ter que converter esse valor-texto em valor-double (ou valor-bigdecimal, ou outro de sua preferência). Exemplo:

public double parseStringToDouble(String texto) {
    String valor = texto.replace(".", "").replace(",", ".");
    return Double.parseDouble(valor);
}

// e usar assim
total = total + parseStringToDouble(contas.resultset.getString("valor"));

// aqui você seta o total no jLabel total a pagar. Use sua mascaravalor pra ficar melhor
suaLabel.setText(String.valueOf(total));
C
vinilima:
É rpz, com seu modelo ai de valor em campo texto o trabalho é braçal. Você vai ter que converter esse valor-texto em valor-double (ou valor-bigdecimal, ou outro de sua preferência). Exemplo:
public double parseStringToDouble(String texto) {
    String valor = texto.replace(".", "").replace(",", ".");
    return Double.parseDouble(valor);
}

// e usar assim
total = total + parseStringToDouble(contas.resultset.getString("valor"));

// aqui você seta o total no jLabel total a pagar. Use sua mascaravalor pra ficar melhor
suaLabel.setText(String.valueOf(total));

Vilinima
Desculpe a minha ignorancia em Java, tentei colocar esse codigo novo, mas não funcionou, como faço isso, aonde coloco tudo isso, tenho que ir desde o começo da nossa conversa

vinilima

Um pergunta, esse software é pra uso comercial ou apenas aprendizagem?

C

Sempre tive vontade de elaborar sistemas, desde da epoca dos Apple, na epoca fiz um curso de DBase, Cobol e outros, mas depois
parei com tudo, agora faço sistemas em VB, mas não comercializo, faço para ajudar as pessoas em seus dia a dia, como dona de casa
estudantes e outros, ajudo um centro espirita que frequento fazendo sistemas para ajuda-los em cadastro de seus associados, documentação etc. Agora me deu na cabeça que quero aprender Java, não sei porque, talvez goste do nome e como te disse sou Autoditada, aprendo com pesquisas, livrarias, artigos e outros

Criado 25 de agosto de 2011
Ultima resposta 31 de ago. de 2011
Respostas 23
Participantes 6