Calculos com jTable[Resolvido]

ps: não é exercico de faculdade, é num sistema q to fazendo… :slight_smile:

Olá pessoal!
To quebrado a cabeça aki para fazer o segunte: pegar o valor do produto numa coluna, e multiplicar por outro valor em outra coluna, e mostar num jlabe. Isso eu até consigo fazer, mas o problema é q ele calcula e mostra um de cada vez, e não acumula a soma no jlabel. Segue o código:

Object qtde = jTable1.getValueAt(jTable1.getSelectedRow(),3);
        Object preco = jTable1.getValueAt(jTable1.getSelectedRow(),1);
        
        String valorCompra =String.valueOf(preco);
    String qnte =String.valueOf(qtde);
    
    double pre=0,soma=0;
    int qtd=0;
    pre=Double.parseDouble(valorCompra);
    qtd=Integer.parseInt(qnte);
    
    soma=soma+(qtd*pre);
    
    jLabel3.setText(""+ soma);

Eu queria q conforme o usuario for digitanto q quantidade na linha da coluna 3, fosse acumulando no jlabel…o evento eu fiz qndo aperta o tab, aí ele faz o calculo, só q como eu disse, ele faz de cada um e não acumula.
Ou se possivel,e ainda melhor, se o calculo fosse feito no evento do botão (o evento eu sei) , mas não sei como faria pra calcular tudo de uma vez na jtable, tipo coluna3linha1 x coluna1lina1… entendem? deve ser tipo uma matriz…coisa q não sou lá mto bom…hehehe

Obrigado quem puder ajudar!

Será q é tão complicado assim??? :shock:

Você quer fazer uma planilha Excel no seu programa?

Não não po, hehehe, vou explicar o cenário:
A jtable contem uma lista de produtos com estoque baixo.
aí a ultima colina da tabela é editavel, onde a pessoa digita a quantidade de itens q quer pedir.
aí eu calculo o preço de fabrica x a quantidade de itens… e na jlabel mostra o valor total do pedido de todos os produtos…
entendeu?
Creio q se resolva com uma matriz de objetos, mas não sei como fazer pra colocar as colunas com os valores da jtable das respectivas colunas q quero :frowning:

alguem??

:?:

[quote=nathanRayden]alguem??

:?: [/quote]

Não acumula porque a variável soma é local. Toda vez que entrar neste método ela será redeclarada e será atribuído 0 a ela.
Declare a variável global ou

soma = Double.parseDouble(Label3.getText()); // lebrando que o texto inicial da label deve ser 0 soma=soma+(qtd*pre); Label3.setText(""+ soma);

é isso ou algo do tipo. Testa aí e fala se resolveu…

Mas tem como calcular tudo de uma vez ao evento do botão? tem como me dar um exemplo por favor???

tem sim. Dessas duas maneira que te mostrei e outras.

  1. Você deve colocar no texto da jLabel3 o valor 0, certo?

[code]Object qtde = jTable1.getValueAt(jTable1.getSelectedRow(),3);
Object preco = jTable1.getValueAt(jTable1.getSelectedRow(),1);

String valorCompra =String.valueOf(preco);  
String qnte =String.valueOf(qtde);  
  
double pre=0,soma=0;  
int qtd=0;  
pre=Double.parseDouble(valorCompra);  
qtd=Integer.parseInt(qnte);  
  
soma = Double.parseDouble(Label3.getText()); // lebrando que o texto inicial da label deve ser 0  
soma=soma+(qtd*pre);  
Label3.setText(""+ soma); 
  
jLabel3.setText(""+ soma);  

[/code]

ou

  1. você deve declarar a variável soma fora do método do evento, certo?

[code]Object qtde = jTable1.getValueAt(jTable1.getSelectedRow(),3);
Object preco = jTable1.getValueAt(jTable1.getSelectedRow(),1);

String valorCompra =String.valueOf(preco);  
String qnte =String.valueOf(qtde);  
  
double pre=0;//soma=0; a declaração da soma deve ser feita globalmente  
int qtd=0;  
pre=Double.parseDouble(valorCompra);  
qtd=Integer.parseInt(qnte);  
  
soma=soma+(qtd*pre);  
  
jLabel3.setText(""+ soma);  

[/code]

hei…
acho que é isso que você quer!

[code]
import java.awt.BorderLayout;
import java.awt.Component;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

public class Tables extends JFrame {

private JScrollPane scrollPane;
private final JTable table = new JTable();
private LabelTotal labelTotal;

public Tables() {
    init();
}

final void init() {

    List<Produto> l = new LinkedList<Produto>();

    l.add(new Produto("Produto 1", 3.5, 650));
    l.add(new Produto("Produto 2", 53.5, 450));
    l.add(new Produto("Produto 3", 300.0, 120));
    l.add(new Produto("Produto 4", 50.5, 55));
    l.add(new Produto("Produto 5", 38.55, 80));
    l.add(new Produto("Produto 6", 74.0, 60));
    l.add(new Produto("Produto 7", 0.5, 20));
    l.add(new Produto("Produto 8", 1.5, 500));

    table.setModel(new TableProdutoModel(l));

    labelTotal = new LabelTotal(((TableProdutoModel) table.getModel()).getTotal());

    table.setDefaultRenderer(Double.class, new TableProdutoRender());

    ((TableProdutoModel) table.getModel()).addTableModelListener(new TableModelListener() {

        @Override
        public void tableChanged(TableModelEvent e) {
            labelTotal.setText(((TableProdutoModel) table.getModel()).getTotal());
        }
    });

    scrollPane = new JScrollPane(table);


    this.setLayout(new BorderLayout());

    this.add(scrollPane, BorderLayout.CENTER);
    this.add(labelTotal, BorderLayout.PAGE_END);

    this.pack();
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
}

public static void main(String[] args) {
    new Tables();
}

}

class Produto {

private String produto;
private Double valor;
private Integer qnt;

public Produto() {
}

public Produto(String produto, Double valor, Integer qnt) {
    this.produto = produto;
    this.valor = valor;
    this.qnt = qnt;
}

public String getProduto() {
    return produto;
}

public void setProduto(String produto) {
    this.produto = produto;
}

public Integer getQnt() {
    return qnt;
}

public void setQnt(Integer qnt) {
    this.qnt = qnt;
}

public Double getValor() {
    return valor;
}

public void setValor(Double valor) {
    this.valor = valor;
}

}

class TableProdutoModel extends AbstractTableModel {

private List<Produto> listProduto;
private final String colunas[] = new String[]{"Produto", "Valor", "Quantidade", "Total"};

public TableProdutoModel() {
    this.listProduto = new LinkedList<Produto>();
}

public TableProdutoModel(List<Produto> listProduto) {
    this.listProduto = listProduto;
}

@Override
public int getRowCount() {
    return this.listProduto.size();
}

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

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Produto p = listProduto.get(rowIndex);
    switch (columnIndex) {
        case 0:
            return p.getProduto();
        case 1:
            return p.getValor();
        case 2:
            return p.getQnt();
        case 3:
            return p.getQnt() * p.getValor();
        default:
            return null;
    }
}

@Override
public String getColumnName(int column) {
    return colunas[column];
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    Produto p = listProduto.get(rowIndex);
    switch (columnIndex) {
        case 0:
            p.setProduto(aValue.toString());
            break;
        case 1:
            p.setValor(new Double(aValue.toString()));
            break;
        case 2:
            p.setQnt(new Integer(aValue.toString()));
            break;
    }
    fireTableRowsUpdated(rowIndex, rowIndex);
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return columnIndex < colunas.length - 1;
}

public Double getTotal() {
    double total = 0;
    for (Produto p : listProduto) {
        total += p.getQnt() * p.getValor();
    }
    return total;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 0:
            return String.class;
        case 1:
            return Double.class;
        case 2:
            return Integer.class;
        case 3:
            return Double.class;
        default:
            return null;
    }
}

}

class TableProdutoRender extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    c.setText(new DecimalFormat("¤###,##0.00").format(new Double(value.toString())));
    c.setHorizontalAlignment(JLabel.RIGHT);
    return c;
}

}

class LabelTotal extends JLabel {

public LabelTotal(Double valor) {
    this.setText(valor);
    this.setHorizontalAlignment(JLabel.RIGHT);
}

public void setText(Double valor) {
    setText("Total: " + new DecimalFormat("¤###,##0.00").format(valor));
}

}[/code]

Bom, isso não é muito diferente do q fiz né??
Mas o getselectedRow só pega a linha selecionada, eu queria multiplicar linha com linha, coluna com coluna…assim dá na mesma…
Acho q tem como fazer com uma matriz, mas não sei como pegar a coluna toda e multiplicar linha por linha com a outra… :frowning:

Valeu por estar ajudando…

[quote=Marlon Meneses]hei…
acho que é isso que você quer!

[code]
import java.awt.BorderLayout;
import java.awt.Component;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

public class Tables extends JFrame {

private JScrollPane scrollPane;
private final JTable table = new JTable();
private LabelTotal labelTotal;

public Tables() {
    init();
}

final void init() {

    List<Produto> l = new LinkedList<Produto>();

    l.add(new Produto("Produto 1", 3.5, 650));
    l.add(new Produto("Produto 2", 53.5, 450));
    l.add(new Produto("Produto 3", 300.0, 120));
    l.add(new Produto("Produto 4", 50.5, 55));
    l.add(new Produto("Produto 5", 38.55, 80));
    l.add(new Produto("Produto 6", 74.0, 60));
    l.add(new Produto("Produto 7", 0.5, 20));
    l.add(new Produto("Produto 8", 1.5, 500));

    table.setModel(new TableProdutoModel(l));

    labelTotal = new LabelTotal(((TableProdutoModel) table.getModel()).getTotal());

    table.setDefaultRenderer(Double.class, new TableProdutoRender());

    ((TableProdutoModel) table.getModel()).addTableModelListener(new TableModelListener() {

        @Override
        public void tableChanged(TableModelEvent e) {
            labelTotal.setText(((TableProdutoModel) table.getModel()).getTotal());
        }
    });

    scrollPane = new JScrollPane(table);


    this.setLayout(new BorderLayout());

    this.add(scrollPane, BorderLayout.CENTER);
    this.add(labelTotal, BorderLayout.PAGE_END);

    this.pack();
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
}

public static void main(String[] args) {
    new Tables();
}

}

class Produto {

private String produto;
private Double valor;
private Integer qnt;

public Produto() {
}

public Produto(String produto, Double valor, Integer qnt) {
    this.produto = produto;
    this.valor = valor;
    this.qnt = qnt;
}

public String getProduto() {
    return produto;
}

public void setProduto(String produto) {
    this.produto = produto;
}

public Integer getQnt() {
    return qnt;
}

public void setQnt(Integer qnt) {
    this.qnt = qnt;
}

public Double getValor() {
    return valor;
}

public void setValor(Double valor) {
    this.valor = valor;
}

}

class TableProdutoModel extends AbstractTableModel {

private List<Produto> listProduto;
private final String colunas[] = new String[]{"Produto", "Valor", "Quantidade", "Total"};

public TableProdutoModel() {
    this.listProduto = new LinkedList<Produto>();
}

public TableProdutoModel(List<Produto> listProduto) {
    this.listProduto = listProduto;
}

@Override
public int getRowCount() {
    return this.listProduto.size();
}

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

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Produto p = listProduto.get(rowIndex);
    switch (columnIndex) {
        case 0:
            return p.getProduto();
        case 1:
            return p.getValor();
        case 2:
            return p.getQnt();
        case 3:
            return p.getQnt() * p.getValor();
        default:
            return null;
    }
}

@Override
public String getColumnName(int column) {
    return colunas[column];
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    Produto p = listProduto.get(rowIndex);
    switch (columnIndex) {
        case 0:
            p.setProduto(aValue.toString());
            break;
        case 1:
            p.setValor(new Double(aValue.toString()));
            break;
        case 2:
            p.setQnt(new Integer(aValue.toString()));
            break;
    }
    fireTableRowsUpdated(rowIndex, rowIndex);
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return columnIndex < colunas.length - 1;
}

public Double getTotal() {
    double total = 0;
    for (Produto p : listProduto) {
        total += p.getQnt() * p.getValor();
    }
    return total;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 0:
            return String.class;
        case 1:
            return Double.class;
        case 2:
            return Integer.class;
        case 3:
            return Double.class;
        default:
            return null;
    }
}

}

class TableProdutoRender extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    c.setText(new DecimalFormat("¤###,##0.00").format(new Double(value.toString())));
    c.setHorizontalAlignment(JLabel.RIGHT);
    return c;
}

}

class LabelTotal extends JLabel {

public LabelTotal(Double valor) {
    this.setText(valor);
    this.setHorizontalAlignment(JLabel.RIGHT);
}

public void setText(Double valor) {
    setText("Total: " + new DecimalFormat("¤###,##0.00").format(valor));
}

}[/code][/quote]

Cara, bem complexo seu código… :shock:
Mas no meu caso, os dados vem doo banco e preenche a table, q a quantidade é digitada pelo usuario, e não vem da classe peoduto…
Vou testar esse codigo pra mim entender melhor…Obrigadão!

calma amigo!
não é tão complexo como você imagina…
as colunas são editáveis, e a medida que a quantidade ou o valor muda, é tudo recalcularo
experimente!
qualquer dúvida posta aih!!

Por favor, não banalize tags informativas como [Resolvido] ou [Ruby] usando-as para falar o óbvio [Dúvida], [Ajuda], [Urgente].
Além disso, procure também abrir sua dúvida no fórum correto, isso ajuda as pessoas que podem responder a localiza-lo.

No caso dessa, a dúvida é de interface gráfica, não se preocupe, já movi o tópico para o local correto.

Quanto ao JTable, dê uma olhada na minha assinatura. Ao lado do link em vermelho, há diversos exemplos de como montar seu TableModel. É importantíssimo entender como o TableModel funciona se você quiser trabalhar com o JTable.

[quote=Marlon Meneses]calma amigo!
não é tão complexo como você imagina…
as colunas são editáveis, e a medida que a quantidade ou o valor muda, é tudo recalcularo
experimente!
qualquer dúvida posta aih!![/quote]

Valeu marlon, mas não consegui assim…
Seria mais viavel pra mim, se os calculos fossem feitos no evento do botão, ao inves de fazer a cada qntde digitada, pq aí ele pode alterar a quantidade qndo quiser e só fazer o calculo quando clicar no botão, evitando q ele volte para uma linha acima…
Estou tentando abstrair esse problema como uma matriz, pois a jtable é como se fosse uma, so não sei como pegar todas as linhas das colunas…

Obrigado, e se ainda puder ajudar, obrigado mais ainda…

Captei a mensagem mestre…

[quote=ViniGodoy]
Quanto ao JTable, dê uma olhada na minha assinatura. Ao lado do link em vermelho, há diversos exemplos de como montar seu TableModel. É importantíssimo entender como o TableModel funciona se você quiser trabalhar com o JTable.[/quote]

Vini, dei uma olhada no table model, ví exemplos q fazem referencias a classes, e preenchidas a mão. No meu caso, é preenchido do banco…
No table model se cria uma list e add a list no table model…
Tem como trazer os valores do banco na list e add no table model? Mas ainda assim não aprendi como se faz a multiplicação…acho q ninguem nunca fez… :shock:
Obrigado!

[quote=nathanRayden][quote=ViniGodoy]
Quanto ao JTable, dê uma olhada na minha assinatura. Ao lado do link em vermelho, há diversos exemplos de como montar seu TableModel. É importantíssimo entender como o TableModel funciona se você quiser trabalhar com o JTable.[/quote]

Vini, dei uma olhada no table model, ví exemplos q fazem referencias a classes, e preenchidas a mão. No meu caso, é preenchido do banco…
No table model se cria uma list e add a list no table model…
Tem como trazer os valores do banco na list e add no table model? Mas ainda assim não aprendi como se faz a multiplicação…acho q ninguem nunca fez… :shock:
Obrigado![/quote]

vc ainda nao entendeu como acontece…

veja o codigo que eu exemplifiquei!
imagine que a classe Produto seja o model que representa a tabela “produto” no banco
observe agora o construtor

da classe TableProdutoModel. este construtor tem como parametro uma lista de produtos
então basta retornar uma lista de produtos da sua consulta ao banco e setar no construtor do tablemodel igual a linha 39 do codido de exemplo!
entendeu?

Consegui fazer do jeito que eu queria!
Um amigo me deu uma mão, agora calcula automatico ao sair do foco e pelo botão tb…
Obrigado a todos, obrigado Marlon, Feliz ano novo pra vcs!
Depois vou postar o codigo, pode servir pra alguem…

1 curtida

:smiley: