Preencher Jtable com tableas relacionadas - Swing

8 respostas
N

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.

8 Respostas

ViniGodoy

Assim não dá para entender nada, siga essas dicas:

SandroSoftwares
Só pra melhorar um pouco a visualização, vc posta o código entre a tag code seu código /code
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>(); 
/*/ for (Protese prt : linhas) { 
System.out.println(" Id. Grupo=" + (prt.getGrupoprotese().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())); 

}*/ 

} 

/* Cria um ProteseTableModel carregado com 
* a lista de Protese especificada. */ 
public ProteseTableModel(List<Protese> listaDeProtese) { 
// if (!listaDeProtese.isEmpty()){ 
grupoprotese g = new grupoprotese(); 
linhas = new ArrayList<Protese>(listaDeProtese); 
for (Protese prt : linhas) { 
// 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())); 

} 
// } 
// else { 
// System.out.println("ListaDeProtese Vazia!"); 

// } 


System.out.println("passei na ProteseTableModel!"); 
} 


/* 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: 
GrupodeProteseDao daogrp = null; 
ProteseDao dao = null; 
try { 
dao = new ProteseDao(); 
daogrp = new GrupodeProteseDao(); 
listaDeProtese = (ArrayList<Protese> dao.listAll(); 
/* 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())); 
// System.out.println(" Id. Grupo=" + (protese.getGrupoprotese().getId())); 
System.out.println(" Nome Grupo=" + (g.getNomegrupo())); 
// txtProtese.requestFocus(); 
} 

}*/ 
// 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 minha = new ProteseTableModel(dao.listAll()); 
jTProtese.setModel(minha); 
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(); 
}
SandroSoftwares

já encontrei uns negócios aqui…

seu código get (linha 46) não estão retornando nada… get tem que retornar algo por isso não podem ser void.

SandroSoftwares

nas linhas 49 a 50 vc não está setando nada para o grupoprotese... logo não vai retornar nada com o get
poderia ser assim:

public void setGrupoprotese(grupoprotese grupoprotese) {   
  this.grupoprotese.setId(grupoprotese.getId());
  this.grupoprotese.setNomegrupo(grupoprotese.getNomegrupo());
  return grupoprotese;

}
SandroSoftwares

vou postar pra você como eu costumo fazer quando tenho uma consulta ao banco que retorna uma chave estrangeira de outra tabela para que possa consultar na tabela de origem a que se refere aquele id.

Considere por exemplo que eu tenho uma certa CIDADE que pertence a um determinado ESTADO.

Como sabemos ESTADO possui diversas cidades logo em cidades temos que colocar a chave estrangeira IDESTADO para identificar a que estado aquela cidade pertence.

logo em termos de relacionamento é a mesma coisa que vc tá enfrentando: CIDADE equivale a PROTESE e ESTADO equivale a GRUPOPROTESE.

Na classe CIDADE tenho os seguintes atributos com seus gets e sets:

private int idCidade;
 private int idEstado; //aqui pra chamar inserir a chave estrangeira do estado a que pertence a cidade
 private String  nomeCidade;

//gets
//sets

Na hora de inserir uma cidade no banco:

public void adiciona(Cidade cidade) throws SQLException {

        String sql = "insert into Cidade (idEstado, nomeCidade) values(?,?)";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setInt(1, cidade.getIdEstado());
        stmt.setString(2, cidade.getNomeCidade());

        stmt.execute();
        stmt.close();
    }

pronto, gravei a cidade com o id do estado a que ela pertence.

simples de mais né???!!!

na hora de consultar no banco faço:

CidadeDao dao = new CidadeDao();
            ResultSet cidades = dao.getCidade(); //traz todas as cidades com suas chaves estrangeiras de estados

            while (cidades.next()) {

            //aqui dentro é que vem a resolução da questão:
           //faço uma consulta no banco pesquisando na tabela ESTADO buscando qual o estado que aquele idEstado representa:

                try {
                    EstadosDao dao2 = new EstadosDao();
                    ResultSet estadosPeloCodigo = dao2.getEstadoJaCadastrado(cidades.getInt("idEstado"));

                    if (estadosPeloCodigo.next()) {
                        //Aqui você adiciona os campos do banco de dados no jTable.
                        modelo.addRow(new Object[]{++cont, cidades.getInt("idCidade"), estadosPeloCodigo.getString("siglaEstado"), cidades.getString("nomeCidade")});
                    }
                    estadosPeloCodigo.close();
                    dao2.getEstadoJaCadastrado(cidades.getInt("idEstado")).close();
                } catch (SQLException ex) {
                    Logger.getLogger(JInternalFrameCidades.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            cidades.close();
            dao.getCidade().close();

Simples assim... você trabalha só com inteiros e resolve o problema.

No seu caso é só substituir CIDADE por PROTESE e ESTADO por GRUPOPROTESE

Espero ter ajudado!

N

Sandro

Obrigado por vc ter me mostrado uma alternativa simples. Mas, no meu caso estou seguindo orientação do GUJ, tenho o ProteseDao que ja me traz a lista de Protese com a chave estrangeira e o nome do grupo atraves de um join. Estou querendo modelar a minha jtable(passando a minha lista) e ja estou chamando o meu modelo da seguinte maneira:
Minha classe:

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.setId(grupoprotese.getId());  
      this.grupoprotese.setNomegrupo(grupoprotese.getNomegrupo());  
 
    }


    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;
    }

    @Override
    public String toString() {
        return "Protese{" + "id=" + id + ", nome=" + nome + ", prazo=" + prazo + ", grupoprotese=" + grupoprotese + '}';
    }

}

Minha 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.", "Nome 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) {
// Da erro nesta linha abaixo que é a classe Grupo            
//                   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()));     
            
        }
        
        

System.out.println("passei na ProteseTableModel!");
    }  
  
  
    /* 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.
			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: "Tipo","Data de Cadastro", "Nome", "Idade"};  
            case 0:  
                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) {
        
    } 
  
}

Meu botão pesquisar:

private void jbPesquisarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        GrupodeProteseDao daogrp = null;
        ProteseDao dao = null ;
        try {
            daogrp = new GrupodeProteseDao(); 
            dao = new ProteseDao();
        } catch (SQLException ex) {
            Logger.getLogger(jIFProtese.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            listaDeProtese = (ArrayList<Protese>) dao.listAll();
            for (Protese prt : listaDeProtese){
               if(prt instanceof Protese){  
                       //aqui é feito um cast  
                   System.out.println(" Passei na list Protese antes!");     
                    Protese protese = (Protese)prt;  
                   System.out.println("Id.= " + protese.getId());
                   System.out.println("Nome Protese=" + (protese.getNome()));     
                   System.out.println(" Prazo=" + (protese.getPrazo().toString()));     
//Na list aqui da este erro quando clico no botão:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
// preciso saber como posso acessar a minha classe(o id e o nome do grupo) quando clico no botão?
                  System.out.println(" Id. Grupo=" + (protese.getGrupoprotese().getId()));     
                   System.out.println(" Nome Grupo=" + (g.getNomegrupo()));    
                }   
                
            }*/
//            preencheTbm();
            ProteseTableModel minha = new ProteseTableModel(dao.listAll());  
            jTProtese.setModel(minha);  
            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();
    }

Agradeço mais uma vez por tentarem me ajudar.

SandroSoftwares

Está claro que o erro está entre as linhas 12 e 21 (grupoProteses com seu get e set).

Eu testaria o seguinte: Como vc disse que o join já está retornando o idGrupo e o nomeGrupo, criaria dois atributos substituindo grupoProtese:

int idGrupo;
String nomeGrupo;

public int getIdGrupo() {  
        return idGrupo;  
    }  
  
    public void setIdGrupo(int idGrupo) {  
        this.idGrupo = idGrupo;  
    } 
public String getNomeGrupo() {  
        return nomeGrupo;  
    }
  public void setNomeGrupo(String nomeGrupo) {  
        this.nomeGrupo = nomeGrupo;  
    }

Se seu sql estiver correto irá retornar estes campos separados juntamente com os outros...

então, na hora de chamar na tabela seria só distribuir cada coisa no seu lugar: as linhas 41 a 49 ficariam:

for (Protese prt : linhas) {  
// Da erro nesta linha abaixo que é a classe Grupo              
                 System.out.println(" Id. Grupo=" + (prt.getIdGrupo().toString()));       
                   System.out.println(" Nome Grupo=" + (prt.getNomeGrupo()));       
                   System.out.println("id Prt=" + (prt.getId().toString()));       
                   System.out.println("Nome Prt=" + (prt.getNome()));       
                   System.out.println(" Prazo=" + (prt.getPrazo().toString()));       
              
        }

talvez o erro esteja também na linha 39 onde o objeto Grupoprotese g = new Grupoprotese(); é construído sem setar nada nele... logo não irá retornar nada...

Olha ai...

N

Sandro

Realmente vc tinha razão o erro era nas linhas que vc indicou. Corrigir com suas sugestôes e deu certo. Muito obrigado.
Agora pq não retornava para a classe, estava fazendo algo errado ou existe uma outra forma de fazer com tabelas relacionadas? Desculpe, preciso saber pois, neste caso fiz um gatilho pra enganar o java? ou o que? Qual a forma de se trabalhar com tabelas relacionadas. Tem algumas partes desse sistema que vou trabalhar com muitas tabelas relacionadas.

Outra duvida se for possivel, fiz uma outra JTable com JPA mais complexa só que quando chamo a aplicação a gente sente uma degradação para aparecer a tela. A diferença é muita grande de JPA para essa forma via SQL. Se possivel queria sua opinião. Obrigado mais uma vez.

Criado 7 de setembro de 2012
Ultima resposta 11 de set. de 2012
Respostas 8
Participantes 3