[RESOLVIDO] Problema ao preencher o JTable

Olá pessoal. Estou com um problema para preencher minha segunda JTable com dados vindo de uma primeira, que está em outro frame. A primeira tabela eu consigo preencher com dados do banco, mas quando eu tento levar os dados para a outra tabela dá um erro de “java.lang.NullPointerException”. Mas eu já fiz o teste e já vi que o objeto está preenchido e mostra os dados no outro frame. Não estou conseguindo solucionar este problema. Incusive, estou usando um exemplo disponível aqui no fórum. Vou deixar os códigos da criação das JTable.

Classe: pesquisaDAO

[code] package metasoftware.dao;

import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

import javax.swing.JTable; import javax.swing.table.DefaultTableModel;

import metasoftware.utils.PesDesenTableModel; import metasoftware.utils.PesquisaDesen;

public class pesquisaDAO extends DAO{

public PesquisaDesen desen = new PesquisaDesen(); public PesDesenTableModel model; public JTable tblDes;

public JTable encheTabela() throws DAOException{ try{ String sql = “select idDesenvolvedor, Nome, Responsabilidade from pessoa p inner join desenvolvedor d on p.idpessoa = d.idDesenvolvedor order by 1”; ResultSet rs = executaSelect(sql); rs.first();

do{ int id = Integer.parseInt(rs.getObject(“idDesenvolvedor”).toString()); String desenvolvedor = rs.getObject(“Nome”).toString(); String responsa = rs.getObject(“Responsabilidade”).toString(); desen = getDesen(id, desenvolvedor, responsa); getModel().addDesen(desen); }while(rs.next());

}catch (SQLException e) { throw new DAOException(e); } finally { cleanUp(); } tblDes.setModel(model); return tblDes; }

public void pesquisaDes(String nome) throws DAOException{ model.limpar(); try{ String sql = “select idDesenvolvedor, Nome, Responsabilidade from pessoa p inner join desenvolvedor d on p.idpessoa = d.idDesenvolvedor where Nome Like '%”+nome+"%’ order by 1"; ResultSet rs = executaSelect(sql); rs.first(); do{ int id = Integer.parseInt(rs.getObject(“idDesenvolvedor”).toString()); String desenvolvedor = rs.getObject(“Nome”).toString(); String responsa = rs.getObject(“Responsabilidade”).toString(); desen = getDesen(id, desenvolvedor, responsa); getModel().addDesen(desen); //modelo.addRow(new Object[] {rs.getObject(“idDesenvolvedor”), rs.getObject(“Nome”), rs.getObject(“Responsabilidade”)});

}while(rs.next());

}catch (SQLException e) { throw new DAOException(e); } finally { cleanUp(); } tblDes.setModel(model); }

private PesDesenTableModel getModel() { if (model == null) { model = (PesDesenTableModel) getTblDesen().getModel(); } return model; }

private JTable getTblDesen() { if (tblDes == null) { tblDes = new JTable(); tblDes.setModel(new PesDesenTableModel()); } return tblDes; }

public PesquisaDesen getDesen(int id, String desenvolvedor, String responsa) { PesquisaDesen desen = new PesquisaDesen(); desen.setId(id); desen.setDesenvolvedor(desenvolvedor); desen.setResponsa(responsa); return desen; }

public void addDesen(PesquisaDesen desen) { getModel().addDesen(desen); }

}[/code]

Classe: pesDesControl

[code]package metasoftware.controller;

import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

import javax.swing.JScrollPane; import javax.swing.JTable;

import metasoftware.dao.pesquisaDAO; import metasoftware.dao.DAOException; import metasoftware.ui.PesquisaDesenvolvedor; import metasoftware.utils.PesquisaDesen; import metasoftware.utils.UIUtils; import metasoftware.controller.equProControl;;

public class pesDesControl extends PesquisaDesenvolvedor implements ActionListener{ private pesquisaDAO pesquisaDAO = new pesquisaDAO(); private equProControl equProControl = new equProControl(); Object matdes [][]; private JTable tabelades;

public pesDesControl() { addEventos(); //criaColuna(); try { pesquisaDAO.encheTabela(); } catch (DAOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //criaLinha(matdes); }

public pesDesControl(JTable tabela) { this.tabelades = tabela; addEventos(); JTable tblDes; try { tblDes = pesquisaDAO.encheTabela(); criaColuna(tblDes); } catch (DAOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }

//criaLinha(matdes); }

public void addEventos(){ pdOk.addActionListener(this); pdCancelar.addActionListener(this); pdPes.addActionListener(this); pdNome.addActionListener(this); }

@Override public void actionPerformed(ActionEvent event){ if(event.getSource()==pdOk){ PesquisaDesen desen; Object[] linha = {tabelades.getValueAt(tabelades.getSelectedRow(), 0), tabelades.getValueAt(tabelades.getSelectedRow(), 1), tabelades.getValueAt(tabelades.getSelectedRow(), 2)}; int id = Integer.parseInt(linha[0].toString()); String desenvolvedor = linha[1].toString(); String responsa = linha[2].toString(); //System.out.println(id+desenvolvedor+responsa); desen = equProControl.getDesen(id, desenvolvedor, responsa); //System.out.println(desen.getId()+desen.getDesenvolvedor()+desen.getResponsa()); equProControl.addDesen(desen); //equProControl.addDesen(id, desenvolvedor, responsa);

//Object col2 = tabelades.getValueAt(tabelades.getSelectedRow(), 1); //Object col3 = tabelades.getValueAt(tabelades.getSelectedRow(), 2);

dispose(); }else if(event.getSource()==pdCancelar){ dispose(); }else if(event.getSource()==pdNome||event.getSource()==pdPes){ String nome= pdNome.getText(); try { pesquisaDAO.pesquisaDes(nome); } catch (DAOException e) { e.printStackTrace(); } } }

private void criaColuna(JTable tblDes){ tabelades = tblDes; tabelades.setBounds(10, 64, 473, 200); //pesquisaDAO.model.addColumn(“Id”); //pesquisaDAO.modelo.addColumn(“Desenvolvedor”); //pesquisaDAO.modelo.addColumn(“Responsabilidade”); //tabelades.getColumnModel().getColumn(0).setPreferredWidth(5); //tabelades.getColumnModel().getColumn(1).setPreferredWidth(200); //tabelades.getColumnModel().getColumn(2).setPreferredWidth(200); pdScroll = new JScrollPane(tabelades); pdScroll.setBounds(10, 64, 473, 200); panel.add(pdScroll); }

}[/code]

Classe: equProControl

[code]package metasoftware.controller;

import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel;

import metasoftware.dao.equipeProjetoDAO; import metasoftware.dao.pesquisaDAO; import metasoftware.ui.EquipeProjeto; import metasoftware.ui.PesquisaDesenvolvedor; import metasoftware.utils.PesDesenTableModel; import metasoftware.utils.PesquisaDesen; import metasoftware.entity.ProjectTeam;

public class equProControl extends EquipeProjeto implements ActionListener {

private equipeProjetoDAO equipeProjetoDAO = new equipeProjetoDAO(); private pesquisaDAO pesquisaDAO = new pesquisaDAO(); public PesDesenTableModel mod; //private DefaultTableModel modelo1 = new DefaultTableModel();

public equProControl() { addEventos(); //criaTabela(); getContentPane().add(new JScrollPane(getTblDesen())); }

public void addEventos(){ ceSalvar.addActionListener(this); ceCancelar.addActionListener(this); ceAdd.addActionListener(this); ceRem.addActionListener(this); }

@Override public void actionPerformed(ActionEvent event){ if(event.getSource()==ceSalvar){ //ProjectTeam equipeprojeto = new ProjectTeam(); //populateEProjeto(equipeprojeto); abrirPesquisa(tabela);

}else if(event.getSource()==ceCancelar){ dispose(); }else if(event.getSource()==ceAdd){ abrirPesquisa(tabela); }else if(event.getSource()==ceRem){ int id = 1; String desenvolvedor = “aijalon”; String responsa = “Programador”; PesquisaDesen desen = getDesen(id, desenvolvedor, responsa); mod.addDesen(desen); } }

private void populateEProjeto(ProjectTeam equipeprojeto){ equipeprojeto.setNome(ceNome.getText()); //equipeprojeto.setMembros(ce); //equipeprojeto.setFuncaoEquipe(ceFEquipe.getSelectedItem().toString());

}

private void abrirPesquisa(JTable tabela){ PesquisaDesenvolvedor pesdes = new pesDesControl(tabela); pesdes.setVisible(true); }

private void criaTabela(){ tabela = new JTable(mod); tabela.setBounds(10, 64, 473, 200); //modelo1.addColumn(“Id”); //modelo1.addColumn(“Desenvolvedor”); //modelo1.addColumn(“Responsabilidade”); //tabela.getColumnModel().getColumn(0).setPreferredWidth(5); //tabela.getColumnModel().getColumn(1).setPreferredWidth(200); //tabela.getColumnModel().getColumn(2).setPreferredWidth(200); pdScroll = new JScrollPane(tabela); pdScroll.setBounds(10, 64, 473, 200); panel.add(pdScroll); }

public PesquisaDesen getDesen(int id, String desenvolvedor, String responsa) { PesquisaDesen desen = new PesquisaDesen(); desen.setId(id); desen.setDesenvolvedor(desenvolvedor); desen.setResponsa(responsa); return desen; }

public PesDesenTableModel getModel() { if (mod == null) { mod = (PesDesenTableModel)getTblDesen().getModel(); } return mod; }

public JTable getTblDesen() { if (tabela == null) { tabela = new JTable(); tabela.setModel(new PesDesenTableModel()); } return tabela; }

public void addDesen(PesquisaDesen desen) { //System.out.println(desen.getId()+desen.getDesenvolvedor()+desen.getResponsa()); mod.addDesen(desen); }

public void criaColuna2(PesquisaDesen desen){

} }[/code]

Classe: PesDesenTableModel

[code]package metasoftware.utils;

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

/* Implementação de Table Model para exibir os Sócios. @author Eric Yuzo */ public class PesDesenTableModel extends AbstractTableModel {

/ Lista de Sócios que representam as linhas. / private List linhas;

/ Array de Strings com o nome das colunas. / private String[] colunas = new String[] { “Id”, “teste”, “Responsabilidade”};

public String[] criaColunas(){

return colunas; }

/ Cria um SocioTableModel vazio. / public PesDesenTableModel() { linhas = new ArrayList(); }

/ Cria um SocioTableModel carregado com a lista de sócios especificada. */ public PesDesenTableModel(List listaDesen) { linhas = new ArrayList(listaDesen); }

/ Retorna a quantidade de colunas. / @Override public int getColumnCount() { // Está retornando o tamanho do array “colunas”. // Mas como o array é fixo, vai sempre retornar 4. return colunas.length; }

/ Retorna a quantidade de linhas. / @Override public int getRowCount() { // Retorna o tamanho da lista de sócios. return linhas.size(); }

/ Retorna o nome da coluna no índice especificado. Este método é usado pela JTable para saber o texto do cabeçalho. */ @Override public String getColumnName(int columnIndex) { // Retorna o conteúdo do Array que possui o nome das colunas // no índice especificado. 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 Date por causa da formatação. return String.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(“columnIndex out of bounds”); } }

/ Retorna o valor da célula especificada pelos índices da linha e da coluna. */ @Override public Object getValueAt(int rowIndex, int columnIndex) { // Pega o sócio da linha especificada. PesquisaDesen desen = 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) { case 0: // Primeira coluna é o nome. return desen.getId(); case 1: // Segunda coluna é o telefone. return desen.getDesenvolvedor(); case 2: // Terceira coluna é a data de cadastro. return desen.getResponsa(); 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(“columnIndex out of bounds”); } }

/ Seta o valor da célula especificada pelos índices da linha e da coluna. Aqui ele está implementado para não fazer nada, até porque este table model não é editável. */ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {};

/ Retorna um valor booleano que define se a célula em questão pode ser editada ou não. Este método é utilizado pela JTable na hora de definir o editor da célula. Neste caso, estará sempre retornando false, não permitindo que nenhuma célula seja editada. / @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; }

//////////////////////////////////////////////////////////// // Os métodos declarados até aqui foram as implementações // // de TableModel, que são continuamente utilizados // // pela JTable para definir seu comportamento, // // por isso o nome Table Model (Modelo da Tabela). // // // // A partir de agora, os métodos criados serão // // particulares desta classe. Eles serão úteis // // em algumas situações. // ////////////////////////////////////////////////////////////

/ Retorna o sócio da linha especificada. / public PesquisaDesen getDesen(int indiceLinha) { return linhas.get(indiceLinha); }

/ Adiciona um registro. / public void addDesen(PesquisaDesen desen) { // Adiciona o registro. linhas.add(desen);

// Pega a quantidade de registros e subtrai um para achar // o último índice. � preciso subtrair um, pois os índices // começam pelo zero. int ultimoIndice = getRowCount() - 1;

// Reporta a mudança. O JTable recebe a notificação // e se redesenha permitindo que visualizemos a atualização. fireTableRowsInserted(ultimoIndice, ultimoIndice); //System.out.println("valor id: "+linhas.get(0).getId()+“Ultimo Indice”+ultimoIndice); }

/ Remove a linha especificada. / public void removeSocio(int indiceLinha) { // Remove o sócio da linha especificada. linhas.remove(indiceLinha);

// Reporta a mudança. O JTable recebe a notificação // e se redesenha permitindo que visualizemos a atualização. fireTableRowsDeleted(indiceLinha, indiceLinha); }

/ Adiciona uma lista de sócios ao final dos registros. / public void addListaDesen(List desen) { // Pega o tamanho antigo da tabela. int tamanhoAntigo = getRowCount();

// Adiciona os registros. linhas.addAll(desen);

// Reporta a mudança. O JTable recebe a notificação // e se redesenha permitindo que visualizemos a atualização. fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1); }

/ Remove todos os registros. / public void limpar() { // Remove todos os elementos da lista de sócios. linhas.clear();

// Reporta a mudança. O JTable recebe a notificação // e se redesenha permitindo que visualizemos a atualização. fireTableDataChanged(); }

/ Verifica se este table model está vazio. / public boolean isEmpty() { return linhas.isEmpty(); }

}[/code]

Grato desde já.

Eu consegui resolver com a ajuda de Rafael Montagner da seguinte forma: Instanciei o objeto no construtor que estava nulo como segue no código abaixo: mod = (PesDesenTableModel)getTblDesen().getModel();