Coluna da tabela aparece vazia

29 respostas
Daianne

Tenho uma tabela que exibe as turmas cadastradas no banco, mas a coluna com o nome dos instrutores fica vazia,
esta é minha classe turma

package autoescola.modelo;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

/**
 *
 * @author Administrador
 */
public class Turma {
    private String nome;
    private Date dataInicio;
    private Instrutor instrutor;
    private int codigo;
    private String vagas;
    private Date dataConclusao;
    private String horario;

    private ArrayList<Aluno> alunos = new ArrayList<Aluno>();

    public Turma() {
        
    }

    public Turma(String nome, String vagas, Date dataInicil, Date dataConclusao, Instrutor instrutor){
        this.setNome(nome);
        this.setVagas(vagas);
        this.setDataInicio(dataInicil);
        this.setDataInicio(dataInicil);
        this.setInstrutor(instrutor);

    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the data
     */
    public Date getDataInicio() {
        return dataInicio;
    }

    /**
     * @param data the data to set
     */
    public void setDataInicio(Date data) {
        this.dataInicio = data;
    }

    /**
     * @return the instrutor
     */
    public Instrutor getInstrutor() {
        return instrutor;
    }

    /**
     * @param instrutor the instrutor to set
     */
    public void setInstrutor(Instrutor instrutor) {
        this.instrutor = instrutor;
    }

    /**
     * @return the codigo
     */
    public int getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the vagas
     */
    public String getVagas() {
        return vagas;
    }

    /**
     * @param vagas the vagas to set
     */
    public void setVagas(String vagas) {
        this.vagas = vagas;
    }

    /**
     * @return the alunos
     */
    public ArrayList<Aluno> getAlunos() {
        return alunos;
    }

    /**
     * @param alunos the alunos to set
     */
    public void setAlunos(ArrayList<Aluno> alunos) {
        this.alunos = alunos;
    }

    /**
     * @return the dataConclusao
     */
    public Date getDataConclusao() {
        return dataConclusao;
    }

    /**
     * @param dataConclusao the dataConclusao to set
     */
    public void setDataConclusao(Date dataConclusao) {
        this.dataConclusao = dataConclusao;
    }

    /**
     * @return the horario
     */
    public String getHorario() {
        return horario;
    }

    /**
     * @param horario the horario to set
     */
    public void setHorario(String horario) {
        this.horario = horario;
    }

     public String exibirTurma() {
        return "codigo---" + codigo +
                "\n nome---" + nome +
                "\n Instrutor----" + instrutor+
                "\n Inicil---" + dataInicio +
                "\n Conclusão----" + dataConclusao;
           
    }

      public static String convertDate(String format, Date dtConsulta) {
        try {
            SimpleDateFormat formatter = new SimpleDateFormat(format,
                    new Locale("pt", "BR"));
            return formatter.format(dtConsulta);
        }catch (Exception e) {
            return null;
         }
      }

     public String getDataInicioFormatada(){
         return convertDate("dd/MM/yy", getDataInicio());
     }

     public String getDataConclusaoFormatada(){
         return convertDate("dd/MM/yy", getDataConclusao());
     }

}

E esta é minha tabela

private void atualizarTabela() {
       
        try {
            ArrayList<Turma> turmas = turmaDAO.buscarTodosTurmas();

            String[] colunas = new String[]{"Turma", "Instrutor", "Início", "Conclusão ", "Código"};
            Object[][] dados = new Object[turmas.size()][5];

            for (int i = 0; i < turmas.size(); i++) {
                Turma turma = turmas.get(i);

                dados[i][0] = turma.getNome();
                dados[i][1] = turma.getInstrutor();
                dados[i][2] = turma.convertDate("dd/MM/yy",turma.getDataInicio() );
                dados[i][3] = turma.convertDate("dd/MM/yy", turma.getDataConclusao());
                dados[i][4] = turma.getCodigo();
            }

            DefaultTableModel dataModel = new DefaultTableModel(dados, colunas);
            TabelaTurma.setModel(dataModel);

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Erro " + ex.getMessage());
        }
    }

Se alguém pder me ajudar agradeço, (estou usando o netbeans, e o aplicativo é para desktop)

29 Respostas

marcosharbs

na sua consulta está retornando os valores certos?
talvez não esteja retornando corretamente do banco.

Daianne

Esta retornado os valores corretos

tentei acessar um atributo do instrutor

dados[i][2] = turma.getInstrutor().getNome();

mas da esste erro

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

at autoescola.interfaceusuario.ControleDeTurmas.atualizarTabela(ControleDeTurmas.java:66)

at autoescola.interfaceusuario.ControleDeTurmas.TabelaTurmaAncestorAdded(ControleDeTurmas.java:248)
T
turmaDAO.buscarTodosTurmas()

Já traz os objetos criados (new)??

Abraço!

Daianne

esse metode é para exibir as turmas que foram criadas

public ArrayList<Turma> buscarTodosTurmas() throws SQLException {
        Statement smt = conexao.pegarConexao().createStatement();
        String sql = "SELECT * FROM turma";
        ResultSet rsTurma = smt.executeQuery(sql);

        ArrayList<Turma>turmas=new ArrayList<Turma>();
        while(rsTurma.next()){
            Turma turma =criarTurmaAPartirDoResultSet(rsTurma);
            turmas.add(turma);

        }

   return turmas;
     }
wagner_a_lima

Você pode postar a sua tabela turma?

Daianne

ja postei (atualizarTabela)

wagner_a_lima

Me refiro a sua tabela do banco de dados. Pois é o seguinte:
Provavelmente você possui uma tabela turma e outra chamada instrutores e um relacionamento entre elas.

Além da tabela do banco de dados, pode postar o seu método criarTurmaAPartirDoResultSet(rs)?

Daianne
private Turma criarTurmaAPartirDoResultSet(ResultSet rsTurma) throws SQLException {

        Turma turma = new Turma();
        turma.setNome(rsTurma.getString("nome"));
        turma.setCodigo(rsTurma.getInt("codigo"));
        turma.setInstrutor(instrutorDAO.buscar(rsTurma.getInt("instrutor")));
        turma.setDataInicio(rsTurma.getDate("datainicio"));
        turma.setVagas(rsTurma.getString("vaga"));
        turma.setDataConclusao(rsTurma.getDate("dataconclusao"));
      

        return turma;
    }
Daianne

postar a tabela do banco? Como

wagner_a_lima

A estrutura SQL de criação da tabela. Mas veja se ententi:

Em

turma.setInstrutor(instrutorDAO.buscar(rsTurma.getInt("instrutor")));
  • o valor “instrutor” em rsTurma.getInt(“instrutor”) é o nome da chave estrangeira da tabela turmas referente a tabela instrutores. Certo?
  • o método instrutorDAO.buscar(rsTurma.getInt(“instrutor”)) retorna um objeto do tipo Instrutor. Certo?

Acredito que o problema seja no método instrutorDAO.buscar().

Tente o seguinte:

private Turma criarTurmaAPartirDoResultSet(ResultSet rsTurma) throws SQLException {  
      
           Turma turma = new Turma();  
           turma.setNome(rsTurma.getString("nome"));  
           turma.setCodigo(rsTurma.getInt("codigo"));  
           turma.setInstrutor(instrutorDAO.buscar(rsTurma.getInt("instrutor")));  
           turma.setDataInicio(rsTurma.getDate("datainicio"));  
           turma.setVagas(rsTurma.getString("vaga"));  
           turma.setDataConclusao(rsTurma.getDate("dataconclusao"));  
     System.out.println("Instrutor: " + turma.getInstrutor().getNome());     
     
          return turma;  
      }
Daianne

Continua dando erro

run:
Instrutor: null
Instrutor: null
Instrutor: null
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at autoescola.bancosdedados.TurmaDAO.criarTurmaAPartirDoResultSet(TurmaDAO.java:107)

doug

Olá

Acredito que seja dentro do instrutor, pode ser um erro de intenção, uma vez que vc faz uma conexão do jdbc vc tem que manter ela viva…
No seu caso dentro do metodo buscarInstrutor, vc esta fechando (con.close())… isso faz com que interropa seu script.

acredito que seja isso…

O que vc pode fazer é fazer esse sql do instrutor no proprio metodo, ou criar uma estrutura semelhante ao filter do J2EE.

Editado:
Ou se quer manter assim, fazer que sempre que ele pegue uma conexão, seja uma nova e diferente da que vc usa… uma especie de pool
“thread” de conexões JDBC…

Ok.!?
Espero ter ajudado
Flwss

Marck

Voce cadastrou instrutor para a Turma?

Daianne

Estou inserindo um instrutor na turma, o instrutor ja esta cadastrado no banco

este é o meu botão cadastrar turma

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
             TurmaDAO turmaDAO = new TurmaDAO();
        Turma turma = new Turma();

        turma.setNome(CampNome.getText());
        turma.setDataInicio(CampDataInicil.getDate());
        turma.setDataConclusao(CampDataConclusao.getDate());
        turma.setInstrutor((Instrutor) Instrutor.getSelectedItem());
        turma.setHorario(CampCargaHoraria.getText());
        turma.setVagas(CampVaga.getText());

        JOptionPane.showMessageDialog(null, "Cadastro feito com sucesso");

        CampNome.setText("");
        Instrutor.setSelectedIndex(-1);
        CampCargaHoraria.setText("");


        try {
            turmaDAO.inserir(turma);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Erro ao criar "+ex.getMessage());
        }
    }
doug

Dentro deste “turmaDAO.inserir(turma);” como esta?

Daianne
public void inserir(Turma turma) throws SQLException {
        String sql = "INSERT INTO turma( nome,instrutor, datainicio, vaga, dataconclusao) values (?,?,?,?,?)";
        PreparedStatement smt = conexao.pegarConexao().prepareStatement(sql);

        smt.setString(1, turma.getNome());
        smt.setInt(2, turma.getInstrutor().getCodigo());
        smt.setDate(3, new Date(turma.getDataInicio().getTime()));
        smt.setString(4, turma.getVagas());
        smt.setDate(5, new Date(turma.getDataInicio().getTime()));
      
        smt.execute();
        smt.close();

    }

ta funcionando corretamete

Marck

Depois que voce inserir um instrutor para a turma, não deve mais dar erro.
Ve o retorno desse getSelectedItem. Pode ser que esteja retornando null.

Daianne

Esta retornando o codigo do instrutor

Daianne

Ta cadastrando a turma, o problema é na hora de exibir na jTable, onde aparecem todos os campos menos o instrutor, e no banco de dados ta todas as informações certinhas

doug

Precisa fazer um insert tb no instrutor.
Fica mais ou menos isso:

public void inserir(Turma turma) throws SQLException {
        String sql = "INSERT INTO turma( nome,instrutor, datainicio, vaga, dataconclusao) values (?,?,?,?,?)";
        PreparedStatement smt = conexao.pegarConexao().prepareStatement(sql);

        smt.setString(1, turma.getNome());
        smt.setInt(2, turma.getInstrutor().getCodigo());
        smt.setDate(3, new Date(turma.getDataInicio().getTime()));
        smt.setString(4, turma.getVagas());
        smt.setDate(5, new Date(turma.getDataInicio().getTime()));
      
        smt.execute();
        smt.close();

        String sql2 = "INSERT INTO instrutor(<atributos>) values (?,?...)";
        PreparedStatement smt2 = conexao.pegarConexao().prepareStatement(sql2);

        smt2.setInt(1, turma.getInstrutor().getCodigo());
       // Vão todos os dados do instrutor.

        smt2.execute();
        smt2.close();
   }

Experimenta fazer isso… dai acho que funciona

Daianne

na tabela turma do bando de dados tenho alem das outras colunas, a coluna instrutor, na qual aparece o codigo do instrutor, como ficaria ?, teria que inserir mais colunas com atributos do instrutor?

Marck

Sobrecarregue o metodo toString() no instrutor retornando o nome dele.

public String toString()
{
      return nomeDoInstrutor;
}
Daianne

Ja fiz isso e nada adiantou

Marck

Como vc está preenchendo a tabela?

Manda o Model.

Daianne
DefaultTableModel dataModel = new DefaultTableModel(dados, colunas);
            TabelaTurma.setModel(dataModel);
Marck

Lá onde voce preenche o vetor de dados, onde esta

dados[i][1] = turma.getInstrutor();

coloca

dados[i][1] = turma.getInstrutor().getNomeInstrutor();
Daianne

Ja fiz isso tambem e da erro

wagner_a_lima

Acho que thiago está certo. Acredito que você possa resolver fazendo o seguinte:

private Turma criarTurmaAPartirDoResultSet(ResultSet rsTurma) throws SQLException {  
      
           Turma turma = new Turma();  
           turma.setNome(rsTurma.getString("nome"));  
           turma.setCodigo(rsTurma.getInt("codigo"));  

           Instrutor instrutor = new Instrutor();
           instrutor = instrutorDAO.buscar(rsTurma.getInt("instrutor"));
           turma.setInstrutor(instrutor);  

           turma.setDataInicio(rsTurma.getDate("datainicio"));  
           turma.setVagas(rsTurma.getString("vaga"));  
           turma.setDataConclusao(rsTurma.getDate("dataconclusao"));  
          
     
          return turma;  
      }

Pois como ele disse, você está passando para o método setInstrutor, a referência do objeto que está na classe DAO. Acredito que se você fizer uma nova instância de Instrutor e setar um valor nele, conseguirá resolver o problema.

Daianne

Não deu certo, mas qui ta informando que o erro ta na linha

dados [i][4] = turma.getInstrutor().getNome;
Criado 7 de julho de 2009
Ultima resposta 8 de jul. de 2009
Respostas 29
Participantes 6