Como fazer calculo em uma tabela?

Galera, tenho uma tabela com 7 colunas e 45 linhas, sendo que das 7 colunas, o usuario só pode inserir valor em tres, as outras 4 estão não-editaveis. A lógica q eu vos peço é esta: se o usuario digitar apenas duas notas, quero fazer a soma do campo nota1, e nota2, e dividi-lá por 2, e esse valor mostrar em um outro campo, um não editavel para o usuario(um campo ainda da msm tabel), se não, se o usuario digitar os tres valores, é feita a soma e dividida por tres, e o resultado mostrado na outra coluna da tabela. Queria que o calculo fosse instantaneo, o usuario vai digitando os valores(exemplo, tem nota1, nota2, e nota3, o usuario digita nota1, aí lá, no campo resultado, vai mostrando o resultado, o usuario vai e digita a nota1, e a nota2, lá no campo resultado, já vai mostrando, [(nota1+nota2)/2], caso o usuario digitar nota1, nota2, nota3, la na coluna resultado vai fazendo [(nota1+nota2+nota3)/3] ) e no campo resultado já vai mostrando o valor da soma dividido pelo total de colunas q o usuario digitou.
Sei q é algum muito complicado, mas caso alguem tenha o código sem ser instantaneo, ou qm tiver o codigo instantaneo, por favor me digam como fazer isso.
Ia esquecendo, eu estou utilizando o netbeans7.0, e estou utilizando as ferramentas, de só arrastar o objeto.

“Dizem que não existe mais homens bons, quem disse isso, não ver a ajuda q pessoas de grande inteligencia, faz nos foruns aí pelo internet”

Compre uma licença do Excel :slight_smile:
De fato, um dos problemas do JTable é que ele se parece com uma planilha, mas não tem absolutamente nenhum recurso pronto que o faça funcionar como uma planilha.

http://www.eteks.com/jeks/en/

[quote=entanglement]Compre uma licença do Excel :slight_smile:
De fato, um dos problemas do JTable é que ele se parece com uma planilha, mas não tem absolutamente nenhum recurso pronto que o faça funcionar como uma planilha.

http://www.eteks.com/jeks/en/[/quote]

Cara eu só qro saber como fazer um calculo com uma JTable, pq no sistema q estou desenvolvendo presciso disso.

faça metodos efetuando calculo

Se tivesse clicado no link… Clique de novo, por favor.

http://www.eteks.com/jeks/en/

Blz, mas assim, quando qro somar por exemplo dois textFiel, eu uso o variavel.setTextField + variavel.settextField.

Poderia dizer que variavel representa a minha coluna, e q variavel representa a linha, por favor, só basta isso, a lógica toda eu já sei mais ou menos como é, eu só não a variavel referente a coluna e a linha. Como chamar essas variaveis dentro do metodo, q eu fiz.

Vlw, Obrigado, e desculpa pela pergunta, mas é pq eu estou tendo dificuldade nessa parte da tabela, já fiz quase tudo, só enganchei na tabela. blz?vlw!

[quote=entanglement]Se tivesse clicado no link… Clique de novo, por favor.

http://www.eteks.com/jeks/en/
[/quote]

Blz, cara desculpa aí, foi mal, mas assim, vc sabe o nome da variavel que se da da coluna da tabela no netbeans?

passa o códido de suas classes para poder entender

Estou fazendo tudo em JFrames(Tudo no NetBenas, atraves da palheta), aí vai ser assim, o professor, na hora de cadastra as notas, quando ele clicar em cadastrar notas, irá aparecer um outro JFrame, nesse, o professor escolherá a turma, série, e o bimestre, e a quantidade de notas, por aluno para serem cadastradas, aí assim, por exemplo, se ele colocar 3 notas por aluno, gostaria q aparecesse tres campos para que ele colocasse as notas, e um 4º campo para mostrar a média. Aí falei em tabela pq achei melhor, mas se vcs tiverem outra opinião, melhor para o cadastro desas notas, eu vos agradeço. Desculpe-me a demora para responder!

Tente implentar o cálculo no TableModel:

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 */
public class ModeloNota extends AbstractTableModel {

    private ArrayList dados;
    private String[] colunas = {"Nota 1","Nota 2","Nota 3","Média"};
    
    public ModeloNota() {
        super();
        dados = new ArrayList();
        
        for (int i=0; i < 45; i++){
            dados.add(new LinhaNota(0,0,0,0));
        }
    }
 
    @Override
    public int getRowCount() {
        return dados.size();
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        LinhaNota linha = (LinhaNota) dados.get(rowIndex);
        double retorno = 0;
        
        switch (columnIndex) {
            case 0:
                retorno = linha.getNota1();
                break;
            case 1:
                retorno = linha.getNota2();
                break;
            case 2:
                retorno = linha.getNota3();
                break;
            case 3:
                retorno = linha.getMedia();
                break;
        }
        
        if (retorno == 0) {
            return ""; 
        } else {
            return Calculo.formatarNumero(retorno);
        }
    
    }

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

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if (columnIndex == 3) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                
        if (!Calculo.numeroValido(aValue.toString())) {
            return;
        }
        
        LinhaNota linha = (LinhaNota) dados.get(rowIndex);
        double valor = 0;
        
        valor = Calculo.converterNumero(aValue.toString());
        
        switch (columnIndex) {
            case 0:
                linha.setNota1(valor);
                break;
            case 1:
                linha.setNota2(valor);
                break;
            case 2:
                linha.setNota3(valor);
                break;
        }
                
        valor = 0;
        valor = Calculo.calcularMedia(linha.getNota1(), linha.getNota2(), linha.getNota3());
        linha.setMedia(valor);
        
        fireTableDataChanged();
    }
    
}
public class LinhaNota {
    
    private double nota1;
    private double nota2;
    private double nota3;
    private double media;

    public LinhaNota(double nota1, double nota2, double nota3, double media) {
        this.nota1 = nota1;
        this.nota2 = nota2;
        this.nota3 = nota3;
        this.media = media;
    }

    /**
     * @return the nota1
     */
    public double getNota1() {
        return nota1;
    }

    /**
     * @param nota1 the nota1 to set
     */
    public void setNota1(double nota1) {
        this.nota1 = nota1;
    }

    /**
     * @return the nota2
     */
    public double getNota2() {
        return nota2;
    }

    /**
     * @param nota2 the nota2 to set
     */
    public void setNota2(double nota2) {
        this.nota2 = nota2;
    }

    /**
     * @return the nota3
     */
    public double getNota3() {
        return nota3;
    }

    /**
     * @param nota3 the nota3 to set
     */
    public void setNota3(double nota3) {
        this.nota3 = nota3;
    }

    /**
     * @return the media
     */
    public double getMedia() {
        return media;
    }

    /**
     * @param media the media to set
     */
    public void setMedia(double media) {
        this.media = media;
    }
}

E implementar os cálculos em uma classe separada:

import java.text.DecimalFormat;

/**
 *
 */
public class Calculo {

    public static boolean numeroValido(String texto) {
        boolean retorno = false;
        double valor = 0;
        
        if (texto.equals("")) {
            texto = "0";
        }
        
        try {
            valor   = Double.parseDouble(texto.replace(',', '.'));
            
            if ((valor >= 0) && (valor <= 10)) {
                retorno = true;
            } else {
                retorno = false;
            }
                
        } catch (Exception e) {
            retorno = false;
        }        
        
        return retorno;
    }
    
    public static double converterNumero(String texto) {
        double retorno = 0;
                
        try {
            retorno   = Double.parseDouble(texto.replace(',', '.'));
        } catch (Exception e) {
            retorno = 0;
        }        
        
        return retorno;
    }
    
    public static String formatarNumero(double valor) {
        String retorno = "";
        DecimalFormat formatter;
        
        try {
            formatter = new DecimalFormat("#0.00");
            retorno = formatter.format(valor);         
        } catch (Exception e) {
            retorno = "";
            e.printStackTrace();
        }
        
        return retorno;
    }
    
    public static double calcularMedia(double nota1, double nota2, double nota3) {
        double retorno = 0;
        int    qtde    = 0;        
        
        if (nota1 > 0) {
            retorno += nota1;
            qtde += 1;
        }
        
        if (nota2 > 0) {
            retorno += nota2;
            qtde += 1;
        }
        
        if (nota3 > 0) {
            retorno += nota3;
            qtde += 1;
        }
        
        if (qtde > 0) {
            retorno = retorno / qtde;
        } else {
            retorno = 0;
        }
            
        return retorno;
    }
}


[quote=t_java]Tente implentar o cálculo no TableModel:

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 */
public class ModeloNota extends AbstractTableModel {

    private ArrayList dados;
    private String[] colunas = {"Nota 1","Nota 2","Nota 3","Média"};
    
    public ModeloNota() {
        super();
        dados = new ArrayList();
        
        for (int i=0; i < 45; i++){
            dados.add(new LinhaNota(0,0,0,0));
        }
    }
 
    @Override
    public int getRowCount() {
        return dados.size();
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        LinhaNota linha = (LinhaNota) dados.get(rowIndex);
        double retorno = 0;
        
        switch (columnIndex) {
            case 0:
                retorno = linha.getNota1();
                break;
            case 1:
                retorno = linha.getNota2();
                break;
            case 2:
                retorno = linha.getNota3();
                break;
            case 3:
                retorno = linha.getMedia();
                break;
        }
        
        if (retorno == 0) {
            return ""; 
        } else {
            return Calculo.formatarNumero(retorno);
        }
    
    }

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

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if (columnIndex == 3) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                
        if (!Calculo.numeroValido(aValue.toString())) {
            return;
        }
        
        LinhaNota linha = (LinhaNota) dados.get(rowIndex);
        double valor = 0;
        
        valor = Calculo.converterNumero(aValue.toString());
        
        switch (columnIndex) {
            case 0:
                linha.setNota1(valor);
                break;
            case 1:
                linha.setNota2(valor);
                break;
            case 2:
                linha.setNota3(valor);
                break;
        }
                
        valor = 0;
        valor = Calculo.calcularMedia(linha.getNota1(), linha.getNota2(), linha.getNota3());
        linha.setMedia(valor);
        
        fireTableDataChanged();
    }
    
}
public class LinhaNota {
    
    private double nota1;
    private double nota2;
    private double nota3;
    private double media;

    public LinhaNota(double nota1, double nota2, double nota3, double media) {
        this.nota1 = nota1;
        this.nota2 = nota2;
        this.nota3 = nota3;
        this.media = media;
    }

    /**
     * @return the nota1
     */
    public double getNota1() {
        return nota1;
    }

    /**
     * @param nota1 the nota1 to set
     */
    public void setNota1(double nota1) {
        this.nota1 = nota1;
    }

    /**
     * @return the nota2
     */
    public double getNota2() {
        return nota2;
    }

    /**
     * @param nota2 the nota2 to set
     */
    public void setNota2(double nota2) {
        this.nota2 = nota2;
    }

    /**
     * @return the nota3
     */
    public double getNota3() {
        return nota3;
    }

    /**
     * @param nota3 the nota3 to set
     */
    public void setNota3(double nota3) {
        this.nota3 = nota3;
    }

    /**
     * @return the media
     */
    public double getMedia() {
        return media;
    }

    /**
     * @param media the media to set
     */
    public void setMedia(double media) {
        this.media = media;
    }
}

E implementar os cálculos em uma classe separada:

import java.text.DecimalFormat;

/**
 *
 */
public class Calculo {

    public static boolean numeroValido(String texto) {
        boolean retorno = false;
        double valor = 0;
        
        if (texto.equals("")) {
            texto = "0";
        }
        
        try {
            valor   = Double.parseDouble(texto.replace(',', '.'));
            
            if ((valor >= 0) && (valor <= 10)) {
                retorno = true;
            } else {
                retorno = false;
            }
                
        } catch (Exception e) {
            retorno = false;
        }        
        
        return retorno;
    }
    
    public static double converterNumero(String texto) {
        double retorno = 0;
                
        try {
            retorno   = Double.parseDouble(texto.replace(',', '.'));
        } catch (Exception e) {
            retorno = 0;
        }        
        
        return retorno;
    }
    
    public static String formatarNumero(double valor) {
        String retorno = "";
        DecimalFormat formatter;
        
        try {
            formatter = new DecimalFormat("#0.00");
            retorno = formatter.format(valor);         
        } catch (Exception e) {
            retorno = "";
            e.printStackTrace();
        }
        
        return retorno;
    }
    
    public static double calcularMedia(double nota1, double nota2, double nota3) {
        double retorno = 0;
        int    qtde    = 0;        
        
        if (nota1 > 0) {
            retorno += nota1;
            qtde += 1;
        }
        
        if (nota2 > 0) {
            retorno += nota2;
            qtde += 1;
        }
        
        if (nota3 > 0) {
            retorno += nota3;
            qtde += 1;
        }
        
        if (qtde > 0) {
            retorno = retorno / qtde;
        } else {
            retorno = 0;
        }
            
        return retorno;
    }
}

[/quote]

Aí cara, vlw muito obrigado! Vou testar aqui, e depois respondo, mas antemão muito obrigado msm! ah outra pergunta eu posso implementar esse código em JFrame, pré-criado pelo net benas, tipo instanciar ele para um JFrame(da paleta netbeans)?

No Netbeans, você pode criar um JFrame e instanciar um JTable, no exemplo abaixo tenho um JFrame com o nome de JanelaNota e o JTable com o nome de tabela:

 
 private ModeloNota modelo;

 public JanelaNota() {
        initComponents();
        
        modelo = new ModeloNota();
        tabela.setModel(modelo);
    }

[quote=t_java]No Netbeans, você pode criar um JFrame e instanciar um JTable, no exemplo abaixo tenho um JFrame com o nome de JanelaNota e o JTable com o nome de tabela:

 
 private ModeloNota modelo;

 public JanelaNota() {
        initComponents();
        
        modelo = new ModeloNota();
        tabela.setModel(modelo);
    }

[/quote]

cara, desculpa por tantas perguntas, mas é pq estou apredendo java dessa forma, é vendo tutoriais, lendo livros, e tambem fiz um curso. Mas poderia me responder só mais uma coisa? Pronto para esclarecer minha dúvida, quando eu “arrasto” um JTable na paleta do NetBeans, como eu faço para receber os dados digitados? Eu só “arrastei” o JTable, gostaria de saber a variavel que o NetBeans usa para reconhecer a linha, e a coluna. Ah vlw aí pelo código, agora estou implementando-o. Mas eu gostaria só de saber isso, como receber dados do usuario pela tabela da paleta no NetBeans. Vlw! E deculpe-me por tantas perguntas.

Para que um JTable funcione, é necessário ter um modelo de tabela configurada para ela. O modelo de tabela é responsável por informar quantas colunas, os nomes das colunas, quantas linhas a tabela possui, os dados da tabela … , ou seja, tudo relacionado a ela.
Quando você arrasta da paleta do NetBeans, o modelo que vêm com o objeto é o DefaultTableModel que é uma implementação padrão do AbstractTableModel, porém ela é muito genérica.

Dentro da janela “Propriedades” do JTable, existe a propriedade model, onde é possível configurar as colunas e a digitação os valores padrões, porém isto somente é valido quando se está utilizando o DefaultTableModel.

No seu caso, foi implementando um outro modelo a classe ModeloNota em substituição ao DefaultTableModel, o que inviabiliza qualquer alteração ou inserção de dados diretamente da “paleta”. Para recuperar linha e coluna selecionada,seria através do código, utilizando os metódos getSelectedRow() e getSelectedColumn() da JTable e para recuperar os dados da linha e coluna seria utilizado o método getValueAt(Linha, Coluna) da classe ModeloNota.

[quote=t_java]Para que um JTable funcione, é necessário ter um modelo de tabela configurada para ela. O modelo de tabela é responsável por informar quantas colunas, os nomes das colunas, quantas linhas a tabela possui, os dados da tabela … , ou seja, tudo relacionado a ela.
Quando você arrasta da paleta do NetBeans, o modelo que vêm com o objeto é o DefaultTableModel que é uma implementação padrão do AbstractTableModel, porém ela é muito genérica.

Dentro da janela “Propriedades” do JTable, existe a propriedade model, onde é possível configurar as colunas e a digitação os valores padrões, porém isto somente é valido quando se está utilizando o DefaultTableModel.

No seu caso, foi implementando um outro modelo a classe ModeloNota em substituição ao DefaultTableModel, o que inviabiliza qualquer alteração ou inserção de dados diretamente da “paleta”. Para recuperar linha e coluna selecionada,seria através do código, utilizando os metódos getSelectedRow() e getSelectedColumn() da JTable e para recuperar os dados da linha e coluna seria utilizado o método getValueAt(Linha, Coluna) da classe ModeloNota.[/quote]

Aí vlw! Obrigado! Graças a sua ajuda consegui hehe. Muitos Obrigado msm!