Estou com grandes duvidas para preencher a Jtable com tableModel e tabela relacionada, antes fazia com DefaultTableModel mas, nesse caso não funcionou. Tentei seguir o conselho de vcs e querendo aprender estou fazendo com a assinatura neste forum do ViniGodoy e Cia, e tentei aplicar no meu modelo e não funciona.
Tenho duas tabelas uma de Grupo de Protese e outra de Protese com campo relacionado do grupo(id do grupo) e pretendo mostrar este relacionamento na JTable com o seu id e sua descrição. Não consigo retornar esse campo classe do meu bean protese e pegar a descrição do grupo. Está dando um erro "Exception in thread “AWT-EventQueue-0 java.lang.NullPointerException”. Como faço para retornar essa classe do grupo e pegar o seu id e descrição. Na minha lista de Protese vejo o id do grupo e a descrição do gupo, mas, quando vou mostrar na TableModel ele retorna este erro quando tento pegar o codigo da lista. Segue o codigo a seguir para qq ajuda por favor.
Minha classe java:
package modelo;
/**
*
* @author Octacilio
*/
public class Protese {
private Integer id;
private String nome;
private Integer prazo;
private grupoprotese grupoprotese;
public modelo.grupoprotese getGrupoprotese() {
return grupoprotese;
}
public void setGrupoprotese(modelo.grupoprotese grupoprotese) {
this.grupoprotese = grupoprotese;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getPrazo() {
return prazo;
}
public void setPrazo(Integer prazo) {
this.prazo = prazo;
}
public void getGrupoprotese(String toString) {
}
public void setGrupoprotese(String toString) {
}
public void setId(String toString) {
}
public void setPrazo(String toString) {
}
}
package modelo;
import fontes.Cadastros.jIFProtese;
/**
*
* @author Octacilio
*/
public class grupoprotese {
private Integer Id;
private String nomegrupo;
public String getNomegrupo() {
return nomegrupo;
}
public void setNomegrupo(String nomegrupo) {
this.nomegrupo = nomegrupo;
}
public Integer getId() {
return Id;
}
public void setId(Integer Id) {
this.Id = Id;
}
public void setNomegrupo() {
}
}
Codigo da TableModel:
package TableModels;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import modelo.Protese;
import modelo.grupoprotese;
/**
*
* @author Octacilio
*/
public class ProteseTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
/* Lista de Protese que representam as linhas. */
private List<Protese> linhas;
/* Array de Strings com o nome das colunas. */
private String[] colunas = new String[]{
"Id.Grp.", "Descrição do Grupo ","Id.", "Descrição da Prótese ", "Prazo"};
/* Cria um ProteseTableModel vazio. */
public ProteseTableModel() {
System.out.println("passei na ProteseTableModel - inicio!");
linhas = new ArrayList<Protese>();
}
/* Cria um ProteseTableModel carregado com
* a lista de Protese especificada. */
public ProteseTableModel(List<Protese> listaDeProtese) {
grupoprotese g = new grupoprotese();
linhas = new ArrayList<Protese>(listaDeProtese);
for (Protese prt : linhas) {
//Fiz esse sysout para ver se estava entrando aqui e está só que da erro de conflito de campo.
// Da erro nestas linhas abaixo que é a classe Grupo testei dos 2 modos:
// System.out.println(" Id. Grupo=" + (prt.grupoprotese().getId().toString()));
// System.out.println(" Id. Grupo=" + (g.getId().toString()));
System.out.println(" Nome Grupo=" + (g.getNomegrupo()));
System.out.println("id Prt=" + (prt.getId().toString()));
System.out.println("Nome Prt=" + (prt.getNome()));
System.out.println(" Prazo=" + (prt.getPrazo().toString()));
}
}
/* Retorna a quantidade de colunas. */
@Override
public int getColumnCount() {
// Esta retornando o tamanho do array "colunas".
return colunas.length;
}
/* Retorna a quantidade de linhas. */
@Override
public int getRowCount() {
// Retorna o tamanho da lista de Protese.
return linhas.size();
}
@Override
public String getColumnName(int columnIndex) {
// Retorna o conteudo do Array que possui o nome das colunas
return colunas[columnIndex];
}
;
/* Retorna a classe dos elementos da coluna especificada.
* Este método é usado pela JTable na hora de definir o editor da célula. */
@Override
public Class<?> getColumnClass(int columnIndex) {
// Retorna a classe referente a coluna especificada.
// Aqui é feito um switch para verificar qual é a coluna
// e retornar o tipo adequado. As colunas são as mesmas
// que foram especificadas no array "colunas".
switch (columnIndex) {
case 0: // Primeira coluna é o nome, que é uma String.
// Tambem da erro de exceção aqui pq o codigo da classe não é inteiro e então com fazer isso
// vcs podem me ajudar
return Integer.class;
case 1: // Segunda coluna é o telefone, que também é uma String..
return String.class;
case 2: // Terceira coluna é a data de cadastro,
// apesar de ser do tipo Calendar,
// estou retornando Degerate por causa da formatação.
return Integer.class;
case 3: // Quarta coluna é a mensalidade, um double.
return String.class;
case 4: // Quarta coluna é a mensalidade, um double.
return Integer.class;
default:
// Se o Ãndice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de Ãndice fora dos limites).
// Não foi necessário verificar se o Ãndice da linha é inválido,
// pois o próprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("Erro - columnIndex out of bounds");
}
}
;
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Protese protese = linhas.get(rowIndex);
// Retorna o campo referente a coluna especificada.
// Aqui é feito um switch para verificar qual é a coluna
// e retornar o campo adequado. As colunas são as mesmas
// que foram especificadas no array "colunas".
switch (columnIndex) {
// Seguindo o exemplo: "Id do Grupo","Descrição Grupo", "Id. da Protese", "Descrição Protese", "Prazo"};
case 0:
// Tambem da erro de exceção aqui pq o codigo da classe não é inteiro e então com fazer isso
// vcs podem me ajudar
return protese.getGrupoprotese().getId().toString();
case 1:
return protese.getGrupoprotese().getNomegrupo();
case 2:
return protese.getId();
case 3:
return protese.getNome();
case 4:
return protese.getPrazo();
default:
// Isto não deveria acontecer...
throw new IndexOutOfBoundsException("Erro. Coluna Index invalida!!!");
}
}
@Override
//modifica na linha e coluna especificada
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Protese protese = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado
switch (columnIndex) { // Seta o valor do campo respectivo
case 0:
// Protese.setGrupoprotese(aValue.toString());
/* System.out.println("Id.= " + setGrupoprotese+"");
System.out.println("Nome Protese=" + (protese.getNome()));
System.out.println(" Prazo=" + (protese.getPrazo().toString()));
// System.out.println(" Id. Grupo=" + (protese.getGrupoprotese().getId()));
System.out.println(" Nome Grupo=" + (g.getNomegrupo()));*/
case 1:
// Protese.setGrupoprotese(aValue.toString());
case 2:
// Protese.setId(aValue.toString());
case 3:
// Protese.setNome(aValue.toString());
case 4:
// Protese.setPrazo(aValue.toString());
default:
// Isto não deveria acontecer...
}
fireTableCellUpdated(rowIndex, columnIndex);
}
//modifica na linha especificada
public void setValueAt(Protese aValue, int rowIndex) {
Protese protese = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado
protese.setNome(aValue.getNome());
protese.setPrazo(rowIndex);
fireTableCellUpdated(rowIndex, 3);
fireTableCellUpdated(rowIndex, 4);
}
;
;
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public Protese getProtese(int indiceLinha) {
return linhas.get(indiceLinha);
}
/* Adiciona um registro. */
public void addProtese(Protese m) {
// Adiciona o registro.
linhas.add(m);
int ultimoIndice = getRowCount() - 1;
fireTableRowsInserted(ultimoIndice, ultimoIndice);
}
/* Remove a linha especificada. */
public void removeProtese(int indiceLinha) {
linhas.remove(indiceLinha);
fireTableRowsDeleted(indiceLinha, indiceLinha);
}
/* Adiciona uma lista de Protese ao final dos registros. */
public void addListaDeProtese(List<Protese> Protese) {
// Pega o tamanho antigo da tabela.
int tamanhoAntigo = getRowCount();
// Adiciona os registros.
linhas.addAll(Protese);
fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
}
/* Remove todos os registros. */
public void limpar() {
linhas.clear();
fireTableDataChanged();
}
/* Verifica se este table model esta vazio. */
public boolean isEmpty() {
return linhas.isEmpty();
}
public void setVisible(boolean b) {
}
}
Codigo da Aplicação:Botão de pesquisa com a classe Dao.
private void jbPesquisarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
ProteseDao dao = null;
try {
dao = new ProteseDao();
listaDeProtese = (ArrayList<Protese>) dao.listAll();
[list]
for (Protese prt : listaDeProtese){
if(prt instanceof Protese){
//aqui é feito um cast
Protese protese = (Protese)prt;
grupoprotese g = new grupoprotese();
System.out.println("Id.= " + protese.getId());
System.out.println("Nome Protese=" + (protese.getNome()));
System.out.println(" Prazo=" + (protese.getPrazo().toString()));
// Tambem da erro de exceção aqui pq o codigo da classe não é inteiro e então com fazer isso
// vcs podem me ajudar
// System.out.println(" Id. Grupo=" + (protese.getGrupoprotese().getId()));
System.out.println(" Nome Grupo=" + (g.getNomegrupo()));
// txtProtese.requestFocus();
}
[/list]
}
// preencheTbm();
// Este procedimento está correto ou tem uma melhor maneira de instanciar a classe TableModel
// JTProtese é a nossa JTable. ele instancia a ProteseTableModel mas da um erro como anotado acima dentro da classe.
// Alguem pode me ajudar a resolver esse problema. Agradeço qq ajuda.
ProteseTableModel modelo = new ProteseTableModel(dao.listAll());
jTProtese.setModel(modelo);
jScrollPane1.setViewportView(jTProtese);
limpaCampos();
} catch (SQLException ex) {
Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
}
try {
dao.closeConnection();
daogrp.closeConnection();
} catch (SQLException ex) {
Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
}
preencheCmbGrupodeProtese();
}
Por favor me ajudem a corrigir os erros e entender esta rotina que me parece muito boa para desenvolver com JTable.
Grato.