Setar um resultado em uma uma coluna da JTable através de uma condição if/else

Olá colegas,

Desenvolvi um sistema simples de boletim escolar. Conforme os dados são inseridos nas textfields ao clicar no botão Resultado, deverá mostrar em uma JTable. O problema é que a última coluna (resultado) da JTable tem que estar dentro de uma condição if/else para setar se o aluno está “aprovado”, “em recuperação” ou “reprovado conforme a condição”. Estou com dificuldades em descobrir qual é o método correto que seta este resultado de forma dinâmica. Segue o código:

private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                          
       String aluno = txtAluno.getText();
       String selecionado = cmbDisciplinas.getSelectedItem().toString();
       String resultado = "";
       int qtdeFaltas = Integer.parseInt(txtQtdeFaltas.getText());
       double n1 = Double.parseDouble(txtN1.getText());
       double n2 = Double.parseDouble(txtN2.getText());
       int cargaHor = Integer.parseInt(jlCargaHor.getText());
       double media = (n1 + n2) / 2;
 
       Object[] dadosInseridos = new Object[]{
           aluno, //indice 0
           media, //indice 1
           selecionado, //índice 2
           qtdeFaltas,  //índice 3
           resultado //índice 4
           };
           //Criar uma variável do tipo DefautTableModel,
           //para obter os dados do modelo da tabela e converter
           DefaultTableModel tabelaProduto = (DefaultTableModel) tblBoletim.getModel();
 
           //Mostra os dados na tabela
           tabelaProduto.addRow(dadosInseridos);
 
       double freq = (cargaHor * 25) / 100;
 
       if ((media >= 6) && (qtdeFaltas < freq)) {
           resultado = "Aprovado";
           tblBoletim.setValueAt(resultado, 0, 4);
 
       } else if ((media < 6) && (qtdeFaltas <= freq)) {
           resultado = "Em Recuperação!";
       } else {
           resultado = "Reprovado!";
       }
   }                            

Conforme o código e o print acima, o sistema funciona somente para a primeira linha, porque está setando de forma estática, obtendo os valores do índice e coluna, qual seria o método para setar o valor de forma dinâmica do índice e coluna?

Não sei se entendi exatamente o problema, mas acho que você criou o objeto “aluno”, e depois quer alterar apenas o atributo “resultado” diretamente na tabela? Acho que faria mais sentido o objeto “aluno” ter o atributo “resultado” dentro dele. Antes de popular a tabela, você poderia fazer uma função que pega o vetor dadosInseridos e atualiza a variável “resultado” de cada objeto do vetor antes de popular a tabela com eles.

Não use DefaultTableModel, ele só é útil para popular tabelas com dados fixos.

Crie uma classe Aluno com os atributos pertinentes.

Depois crie o seu próprio TableModel extendendo a classe AbstractTableModel.
Recomendo se basear no GenericAbstractTableModel que o colega @Lucas_Camara postou neste tópico.

Adaptando o código, você terá algo mais ou menos assim:

GenericAbstractTableModel<Aluno> alunoTableModel = new GenericAbstractTableModel<>(listaAlunos);
alunoTableModel.addColumn("Aluno", aluno -> aluno.getNome());
alunoTableModel.addColumn("Média", aluno -> aluno.getMedia());
alunoTableModel.addColumn("Disciplina", aluno -> aluno.getDisciplina());
alunoTableModel.addColumn("Faltas", aluno -> aluno.getFaltas());
alunoTableModel.addColumn("Resultado", aluno -> aluno.getResultado());

JTable tableAluno = new JTable(alunoTableModel);

Aí o tal do if else você implementa dentro do método getResultado da classe Aluno.

2 curtidas