Duvida com AbstractTableModel [RESOLVIDO]

10 respostas
wippeldigo

Olá amigos, Boa tarde

Estou com umas duvidas em relação ao AbstractTableModel, tenho meu metodo na classe dao que retorna uma lista buscando todos os meus registros e um metodo na
classe controller retornando uma lista com todos os registros, porem estora um NullPointerException na classe AbstractTableModel no qual não sei porque.. postarei meu código abaixo \/

Método de busca na classe Dao
public List<RelProdutos> findAllRelProdutos() throws SQLException, ParseException{
		List<RelProdutos> produtos = new ArrayList<RelProdutos>();
		
		String select = "SELECT * FROM RELPRODUTOS";
		
		PreparedStatement stmt =  getConnection().prepareStatement(select);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			RelProdutos relProd = new RelProdutos();
			relProd.setProduto(rs.getString("produto"));
			relProd.setOperador(rs.getString("operador"));
			relProd.setTurno(rs.getString("turno"));
			relProd.setLote(rs.getInt("lote"));
			relProd.setVolume(rs.getInt("volume"));
			relProd.setQuantidade(rs.getInt("quantidade"));
			relProd.setDataEntrada(formatarData(rs.getString("dataEntrada")));
			relProd.setDataSaida(formatarData(rs.getString("dataSaida")));
		}
		rs.close();
		stmt.close();
		
		return produtos;
	}
Metodo que retorna a lista de todos os registros na Classe Controller
public List<RelProdutos> listaProdutos(){
		RelProdutosDao relDao = new RelProdutosDao();
		try {
			return relDao.findAllRelProdutos();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Problemas ao localizar produtos \n" +
		e.getLocalizedMessage());
		}catch (ParseException e1){
		}
		return null;
	}
Minha AbstractTableModel
public class TabelaDeCadastros extends AbstractTableModel {
	private static final long serialVersionUID = 1L;
	
	private List<RelProdutos> linhas;
	
	
	private String[] colunas = new String[]{
			"Produto", "Operador", "Turno", "Lote", "Volume", "Qtde.Produzida",	"Data Entrada", "Data Saída"
	};

	public TabelaDeCadastros() {
		linhas = new ArrayList<RelProdutos>();
	}
	
	public TabelaDeCadastros(List<RelProdutos> listaDeProdutos){
		linhas = new ArrayList<RelProdutos>(listaDeProdutos);
	}
	
	@Override
	public int getColumnCount() {
		return colunas.length;
	}

	@Override
	public int getRowCount() {
		return linhas.size();
	}
	
	public String getColumnName(int columnIndex){
		return colunas[columnIndex];
	}
	
	public Class<?> getColumnClass(int columnIndex){
		
		switch (columnIndex) {
		case 0:
			return String.class;
		case 1:
			return String.class;
		case 2:
			return String.class;
		case 3:
			return Integer.class;
		case 4:
			return Integer.class;
		case 5:
			return Integer.class;
		case 6:
			return String.class;
		case 7:
			return String.class;

		default:
			throw new IndexOutOfBoundsException("Fora dos limites!");
		}
		
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		
		RelProdutos relProdutos = linhas.get(rowIndex);
		
		switch (columnIndex) {
		case 0:
			relProdutos.getProduto();
		case 1:
			relProdutos.getOperador();
		case 2:
			relProdutos.getTurno();
		case 3:
			relProdutos.getLote();
		case 4:
			relProdutos.getVolume();
		case 5:
			relProdutos.getQuantidade();
		case 6:
			relProdutos.getDataEntrada();
		case 7:
			relProdutos.getDataSaida();

		default:
			throw new IndexOutOfBoundsException("Fora dos limites!!!");
		}
	}
	
	@Override
	public boolean isCellEditable(int arg0, int arg1) {
		return false;
	}
	
	public void addListaDeProdutos(List<RelProdutos> produtos){
		int tamanhoAntigo = getRowCount();
		
		linhas.addAll(produtos);
		
		fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
		
	}
	
}
Classe Frame
public class RelatorioRegistros extends JFrame {
	private static final long serialVersionUID = 1L;
	
	//private JPanel pnlBotoes;
	private JTable tblRegistro;
	private TabelaDeCadastros registrosModel;
	
	
	public RelatorioRegistros() {
		super("Relatórios e Registros");
		initialize();
	}
	
	private void initialize(){
		setSize(800, 600);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		getContentPane().add(new JScrollPane(getTblProdutos()));
		getModel().addListaDeProdutos(addRegistros());
	}
	
	private JTable getTblProdutos(){
		if(tblRegistro == null){
			tblRegistro = new JTable();
			tblRegistro.setModel(new TabelaDeCadastros());
		}
		return tblRegistro;
		
	}
	
	private TabelaDeCadastros getModel(){
		if(registrosModel == null){
			registrosModel = (TabelaDeCadastros) getTblProdutos().getModel();
		}
		return registrosModel;
	}
	
	private List<RelProdutos> addRegistros(){
		List<RelProdutos> registros = new ArrayList<RelProdutos>();
		registros = new ControleController().listaProdutos();
		return registros;
	}
	
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			
			public void run() {
				new RelatorioRegistros().setVisible(true);
			}
		});
	}

}
'

Quando executo estora o erro NullPointer.. la na linha 94 na classe AbstractTableModel, na Classe Frame tenho um metodo addRegistro crio uma lista
pra receber a lista da Classe Controller com todos os registros, e no metodo de inicializar eu chamo o metodo da classe Abstract.. addListaDeProdutos().. pra preencher as linhas
com os registro do banco, mas estora o erro que citei acima..
gostaria de uma ajuda pra saber onde estou me equivocando?!

Agradeço desde já, abraços

10 Respostas

drsmachado

Tente debugar e ver se ele utiliza o método construtor da tua classe que está estendendo AbstractTableModel.

wippeldigo

Sim eu ja debuguei é claro, e ultiliza sim o metodo construtor(sem o parametro), e depois vai pras colunas, cria elas, vai pra linhas…, ai fode tudo e estora o erro

robinsonbsilva

wippeldigo,

No seu método:

public List&lt;RelProdutos&gt; findAllRelProdutos() throws SQLException, ParseException{

Você não deveria adicionar o objeto RelProdutos relProd = new RelProdutos();
ao list List&lt;RelProdutos&gt; produtos = new ArrayList&lt;RelProdutos&gt;();

public List&lt;RelProdutos&gt; findAllRelProdutos() throws SQLException, ParseException{
		List&lt;RelProdutos&gt; produtos = new ArrayList&lt;RelProdutos&gt;();
		
		String select = "SELECT * FROM RELPRODUTOS";
		
		PreparedStatement stmt =  getConnection().prepareStatement(select);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			RelProdutos relProd = new RelProdutos();
			relProd.setProduto(rs.getString("produto"));
			relProd.setOperador(rs.getString("operador"));
			relProd.setTurno(rs.getString("turno"));
			relProd.setLote(rs.getInt("lote"));
			relProd.setVolume(rs.getInt("volume"));
			relProd.setQuantidade(rs.getInt("quantidade"));
			relProd.setDataEntrada(formatarData(rs.getString("dataEntrada")));
			relProd.setDataSaida(formatarData(rs.getString("dataSaida")));

			produtos.add(relProd);
			relProd=null;

		}
		rs.close();
		stmt.close();
		
		return produtos;
wippeldigo
robinsonbsilva:
wippeldigo, No seu método:
public List&lt;RelProdutos&gt; findAllRelProdutos() throws SQLException, ParseException{
Você não deveria adicionar o objeto
RelProdutos relProd = new RelProdutos();
ao list
List&lt;RelProdutos&gt; produtos = new ArrayList&lt;RelProdutos&gt;();
public List&lt;RelProdutos&gt; findAllRelProdutos() throws SQLException, ParseException{
		List&lt;RelProdutos&gt; produtos = new ArrayList&lt;RelProdutos&gt;();
		
		String select = "SELECT * FROM RELPRODUTOS";
		
		PreparedStatement stmt =  getConnection().prepareStatement(select);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			RelProdutos relProd = new RelProdutos();
			relProd.setProduto(rs.getString("produto"));
			relProd.setOperador(rs.getString("operador"));
			relProd.setTurno(rs.getString("turno"));
			relProd.setLote(rs.getInt("lote"));
			relProd.setVolume(rs.getInt("volume"));
			relProd.setQuantidade(rs.getInt("quantidade"));
			relProd.setDataEntrada(formatarData(rs.getString("dataEntrada")));
			relProd.setDataSaida(formatarData(rs.getString("dataSaida")));

			produtos.add(relProd);
			relProd=null;

		}
		rs.close();
		stmt.close();
		
		return produtos;

desculpa, não entendi bem oq vc quis dizer, seria o caso de fazer List de String?

robinsonbsilva

Não, no while onde vc preenche os objetos com os dados vindos do banco de dados, após popular o objeto, vc simplesmente está descartando, sem “adiciona-lo ao List”

public List&lt;RelProdutos&gt; findAllRelProdutos() throws SQLException, ParseException{
		List&lt;RelProdutos&gt; produtos = new ArrayList&lt;RelProdutos&gt;();
		
		String select = "SELECT * FROM RELPRODUTOS";
		
		PreparedStatement stmt =  getConnection().prepareStatement(select);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			RelProdutos relProd = new RelProdutos();
			relProd.setProduto(rs.getString("produto"));
			relProd.setOperador(rs.getString("operador"));
			relProd.setTurno(rs.getString("turno"));
			relProd.setLote(rs.getInt("lote"));
			relProd.setVolume(rs.getInt("volume"));
			relProd.setQuantidade(rs.getInt("quantidade"));
			relProd.setDataEntrada(formatarData(rs.getString("dataEntrada")));
			relProd.setDataSaida(formatarData(rs.getString("dataSaida")));

			produtos.add(relProd); //ADICIONANDO O ITEM A LISTA
			relProd=null;

		}
		rs.close();
		stmt.close();
		
		return produtos;
wippeldigo

Ah desculpa, falha minha, mas mesmo assim continua o mesmo problema…

wippeldigo

robinsonbsilva:
Não, no while onde vc preenche os objetos com os dados vindos do banco de dados, após popular o objeto, vc simplesmente está descartando, sem "adiciona-lo ao List"

public List&lt;RelProdutos&gt; findAllRelProdutos() throws SQLException, ParseException{
		List&lt;RelProdutos&gt; produtos = new ArrayList&lt;RelProdutos&gt;();
		
		String select = "SELECT * FROM RELPRODUTOS";
		
		PreparedStatement stmt =  getConnection().prepareStatement(select);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			RelProdutos relProd = new RelProdutos();
			relProd.setProduto(rs.getString("produto"));
			relProd.setOperador(rs.getString("operador"));
			relProd.setTurno(rs.getString("turno"));
			relProd.setLote(rs.getInt("lote"));
			relProd.setVolume(rs.getInt("volume"));
			relProd.setQuantidade(rs.getInt("quantidade"));
			relProd.setDataEntrada(formatarData(rs.getString("dataEntrada")));
			relProd.setDataSaida(formatarData(rs.getString("dataSaida")));

			produtos.add(relProd); //ADICIONANDO O ITEM A LISTA
			relProd=null;

		}
		rs.close();
		stmt.close();
		
		return produtos;

Não importa oq eu faça ou como eu faça sempre ta estorando null nessa linha >> linhas.addAll(produtos);

Marky.Vasconcelos

Posta a StackTrace e a linha exata onde acontece o erro.

wippeldigo
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at java.util.ArrayList.addAll(Unknown Source)
	at maqmundi.View.TabelaDeCadastros.addListaDeProdutos(TabelaDeCadastros.java:106)
	at maqmundi.View.RelatorioRegistros.initialize(RelatorioRegistros.java:34)
	at maqmundi.View.RelatorioRegistros.<init>(RelatorioRegistros.java:26)
	at maqmundi.View.RelatorioRegistros$1.run(RelatorioRegistros.java:64)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

essa é a linha, corresponde a linha 94 da Classe que extende AbstractTableModel do codigo que eu postei

ViniGodoy

Com certeza está disparando uma parseException no método do seu controller.

Jamais ignore exceções como você fez. No mínimo, imprima o stack trace delas na tela.

Criado 1 de novembro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 10
Participantes 5