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.
Como você popula os dados nessa JTable?
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
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
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
um exemplo simples:
[code]// 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
}
[/code][code]// 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) );
}
}[/code]
Esse é um exemplo bem simples mas dá uma idéia de como você pode resolver…
[quote=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[/quote]
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:
[code]public double recuperarSomatoriaDeValores() {
double somatoria = 0.0;
for (Classe objetoDaClasse : suaColecao) {
somatoria = somatoria + objetoDaClasse.getValor();
}
return somatoria;
}[/code]
E voilà, tá pronto!
Abraços!
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)
{
}
}
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.
Usar JTable e não usar Modelo é mais feio do que brigar com a mãe por causa de mistura.
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
[quote=vinilima]um exemplo simples:
[code]// 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
}
[/code][code]// 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) );
}
}[/code]
Esse é um exemplo bem simples mas dá uma idéia de como você pode resolver…[/quote]
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)
{
}
}
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]
[quote=CRCJ]Estou meio perdido, segue codigo de quando abro minha tabela, onde eu coloco isso que voçe escreveu
[code]
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) {
}
}[/code]
[/quote]
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
}[/code]
Depois vamos criar uma AbstractTableModel, para a sua JTable
[code]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
[code]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;
}
}[/code]
Agora o pulo do gato kkkk
[code]
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;
}
}[/code]
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
[quote=vinilima][quote=CRCJ]Estou meio perdido, segue codigo de quando abro minha tabela, onde eu coloco isso que voçe escreveu
[code]
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) {
}
}[/code]
[/quote][/quote]
Obrigado, mas não funcionou
Deu erro? Por que não funcionou?
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
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[/quote]
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).
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?
[quote=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?[/quote]
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.