[RESOLVIDO] JTable não carrega dados

6 respostas
C

Caros colegas boa tarde!

Já estou com um bom tempo tentando carregar os dados do BD em uma JTable. Estava utilizando o DefaultTableModel, onde a tabela aparecia normalmente. Pesquisando no fórum vir um poste do ViniGodoy, que falava em não utilizar o DefaultTableModel. Então segui a sugestão de criar um TableModel. Só que agora a tabela não aparece mais, e não sei como fazer para carregar os dados na JTable, segue os códigos das classe:

Agradeço qualquer ajuda!

Utilizo o eclipse.
Para os layout utilizo o jgoodies.
Classe Usuário:

public class Usuario {
	private int id;
	private String usuario;
	private String senha;
	private String nome;
	private String email;
	private String tipo;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsuario() {
		return usuario;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getTipo() {
		return tipo;
	}
	public void setTipo(String tipo) {
		this.tipo = tipo;
	}
Classe UsuarioDAO
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;


public class UsuarioDAO {
	private Connection connection;
	
	public UsuarioDAO(){
		this.connection = new ConnectionFactory().getConnection();
	}
	
	
	// metodo para listar usuarios
	public List <Usuario> getList(){
		try{
			List <Usuario> usuarios = new ArrayList<Usuario>();
			PreparedStatement stmt = connection.prepareStatement("select * from usuarios");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				Usuario usuario = new Usuario();
				usuario.setId(rs.getInt("id"));
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setSenha(rs.getString("senha"));
				usuario.setNome(rs.getString("nome"));
				usuario.setEmail(rs.getString("email"));
				usuario.setTipo(rs.getString("tipo"));
				
				usuarios.add(usuario);
			}
			rs.close();
			stmt.close();
			return usuarios;
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	

}
Classe TableUsuarios
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class TableUsuarios extends AbstractTableModel {
	private static final long serialVersionUID = 1L;

	/**
	 * Essa lista armazenará os objetos do tipo {@link Cliente} atualmente
	 * exibidos na tablela.
	 */
	private List<Usuario> usuarios;

	// ==============================================================
	// Construtores.
	// ==============================================================

	/**
	 * Constutor que simplesmente instancia o nosso {@link List} que usaremos
	 * para guardar os valores.
	 */
	public TableUsuarios () {
		// no construtor, instanciamos o List
		usuarios = new ArrayList<Usuario>();
	}

	/**
	 * Criamos um construtor de conveniência para já popular a lista.
	 * 
	 * @param lista
	 *            a lista de clientes a ser adicionada.
	 */
	public TableUsuarios (List<Usuario> lista) {
		this();
		usuarios.addAll(lista);
	}

	// ==============================================================
	// Métodos implementados.
	// ==============================================================

	@Override
	public Class<?> getColumnClass(int coluna) {
		// todas as colunas representam uma String
		return String.class;
	}

	@Override
	public int getColumnCount() {
		// esse método deve retornar o número de colunas. No caso, 3 (uma para o
		// nome, uma para o sobrenome e uma para o apelido).
		return 3;
	}

	@Override
	public String getColumnName(int coluna) {
		// vamos retornar o nome de cada coluna
		switch (coluna) {
		case 0:
			return "ID";
		case 1:
			return "NOME";
		case 2:
			return "TIPO";
		default:
			return ""; // isso nunca deve ocorrer, pois temos só 3 colunas
		}
	}

	@Override
	public int getRowCount() {
		// retorna o número de linhas, ou seja, a quantidade de entradas na
		// nossa lista.
		return usuarios.size();
	}

	@Override
	public Object getValueAt(int linha, int coluna) {
		// vai retornar o valor de determinada célula. A linha representa a
		// posição do Cliente na nossa lista e a coluna vai ser: 1 - nome, 2 -
		// sobrenome e 3 - apelido
		// primeiro vamos pegar o Cliente da linha
		Usuario users = usuarios.get(linha);
		// façamos um switch
		switch (coluna) {
		case 0:
			return users.getId();
		case 1:
			return users.getNome();
		case 2:
			return users.getTipo(); 
		default:
			return null; // isso nunca deve ocorrer, pois temos só 3 colunas
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		// nesse caso, todas as células são editáveis
		return true;
	}

	@Override
	public void setValueAt(Object valor, int linha, int coluna) {
		// aqui devemos atualizar o valor de nossos Clientes
		// vemos em qual linha ele está
		Usuario users = usuarios.get(linha);
		// e vemos o que será atualizado
		switch (coluna) {
		case 0:
			users.setNome(valor.toString()); // mudamos o nome
			break;
		case 1:
			users.setTipo(valor.toString()); // mudamos o sobrenome
			break;
		}
		// é importante notificar os listeners a cada alteração
		fireTableDataChanged();
	}

	// ==============================================================
	// Até aqui seria o mínimo necessário para um TableModel funcional, mas
	// ainda não há métodos para adicionar, remover ou resgatar objetos. Vamos
	// criá-los.
	// ==============================================================

	/**
	 * Adiciona um novo {@link Usuario} e notifica os listeners que um novo
	 * registro foi adicionado.
	 */
	public void adiciona(Usuario user) {
		usuarios.add(user);
		// informamos os listeners que a linha (size - 1) foi adicionada
		fireTableRowsInserted(usuarios.size() - 1, usuarios.size() - 1);
	}

	/**
	 * Similar ao {@link #adiciona(Usuario)}, porém para remover. Recebe o
	 * índice do cliente a ser removido. Se não souber o índice, use o método
	 * {@link #getIndice(Cliente)} antes.
	 */
	public void remove(int indice) {
		usuarios.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	/**
	 * Retorna o índice de determinado cliente.
	 */
	public int getIndice(Usuario user) {
		return usuarios.indexOf(user);
	}

	/**
	 * Adiciona todos os clientes na lista à este modelo.
	 */
	public void adicionaLista(List<Usuario> lista) {
		int i = usuarios.size();
		usuarios.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	/**
	 * Esvazia a lista.
	 */
	public void limpaLista() {
		int i = usuarios.size();
		usuarios.clear();
		fireTableRowsDeleted(0, i - 1);
	}

}
Classe ManUsuarios
import java.awt.Color;
import java.awt.Container;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

import model.Usuario.TableUsuarios;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.CC;
import com.jgoodies.forms.layout.FormLayout;

import control.UsuarioDAO;

public class ManUsuarios extends JInternalFrame implements TableModelListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Image logo = Toolkit.getDefaultToolkit().createImage("img/usuario.png");	
	private JPanel panel;
	
	private JLabel lbId;
	private JLabel lbNome;
	private JLabel lbUserNome;
	private JLabel lbSenha;
	private JLabel lbEmail;
	private JLabel lbTipo;
	private JLabel lbProcurar;
	
	private JTextField tfId;
	private JTextField tfNome;
	private JTextField tfUserNome;
	private JPasswordField tfSenha;
	private JTextField tfEmail;
	private JComboBox jbTipo;
	private JTextField tfProcurar;
	
	private JButton jbAlterar;
	private JButton jbExcluir;
	private JButton jbNovo;
	private JButton jbSalvar;
	private JButton jbFiltrar;
	
	private TableUsuarios modelo;
	private JTable tbUsuarios;
	private JScrollPane jScrollPane;
	
	private UsuarioDAO usuarios;
	
	public ManUsuarios(){
		super("MANUTENÇÃO DE USUÁRIOS",
	              false, //resizable
	               true, //closable
	              false, //maximizable
	               false);//iconifiable

		setSize(480, 500); 
		
		panel = new JPanel();
	    panel.setBackground(Color.WHITE);
	    setFrameIcon(new ImageIcon(logo));
	 
	    Container container = getContentPane();
	    container.add(panel);  
	           
	    
		init();
		layoutComponents();
	}

	private void init() {
		lbId = new JLabel("ID:");
		lbNome = new JLabel("NOME:");
		lbUserNome = new JLabel("USUÁRIO:");
		lbSenha = new JLabel("SENHA:");
		lbEmail = new JLabel("E-MAIL:");
		lbTipo = new JLabel("TIPO:");
		lbProcurar = new JLabel("PROCURAR:");
		
		tfId = new JTextField();
		tfId.setEditable(false);
		tfNome = new JTextField();
		tfUserNome = new JTextField();
		tfSenha = new JPasswordField();
		tfEmail = new JTextField();
		jbTipo = new JComboBox();
		tfProcurar = new JTextField();
		
		jbAlterar = new JButton("ALTERAR");
		jbExcluir = new JButton("EXCLUIR");
		jbNovo = new JButton("NOVO");
		jbSalvar = new JButton("SALVAR");
		jbFiltrar = new JButton("FILTAR");
		
		
		modelo = new TableUsuarios();
		modelo.addTableModelListener(this);
		modelo.adicionaLista(usuarios.getList());
		tbUsuarios = new JTable();
		tbUsuarios.setModel(modelo);
		jScrollPane = new JScrollPane();
		jScrollPane.setViewportView(tbUsuarios);
		 	
	}
	
	
	private void layoutComponents() {
		String colunas = "20px, right:pref, 3dlu, 150dlu, 3dlu, pref, 20px";
		String linhas = "20px,pref, 5dlu, pref, 5dlu, pref, 5dlu, pref, 5dlu, pref, 5dlu, pref, 5dlu, pref, 5dlu, pref, 5dlu, 110dlu, 20px";
		
		FormLayout layout = new FormLayout(colunas, linhas);
		PanelBuilder builer = new PanelBuilder(layout);
		
		builer.add(lbId, CC.xy(2, 2));
		builer.add(lbNome, CC.xy(2, 4));
		builer.add(lbUserNome, CC.xy(2, 6));
		builer.add(lbSenha, CC.xy(2, 8));
		builer.add(lbEmail, CC.xy(2, 10));
		builer.add(lbTipo, CC.xy(2, 12));
		builer.addSeparator("Lista de Usuários", CC.xyw(2, 14, 5));
		builer.add(lbProcurar, CC.xy(2, 16));
		
		builer.add(tfId, CC.xy(4, 2));
		builer.add(tfNome, CC.xy(4, 4));
		builer.add(tfUserNome, CC.xy(4, 6));
		builer.add(tfSenha, CC.xy(4, 8));
		builer.add(tfEmail, CC.xy(4, 10));
		builer.add(jbTipo, CC.xy(4, 12));
		builer.add(tfProcurar, CC.xy(4, 16));
		
		builer.add(jbAlterar, CC.xy(6, 2));
		builer.add(jbExcluir, CC.xy(6, 4));
		builer.add(jbNovo, CC.xy(6, 6));
		builer.add(jbSalvar, CC.xy(6, 8));
		builer.add(jbFiltrar, CC.xy(6, 16));
		
		builer.add(jScrollPane, CC.xyw(2, 18, 5));
		
		add(builer.getPanel());
	}

	@Override
	public void tableChanged(TableModelEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	
	

}
segue o erro
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at view.ManUsuarios.init(ManUsuarios.java:114)
	at view.ManUsuarios.<init>(ManUsuarios.java:83)
	at view.telaPrincipal.TelaInicial$3.actionPerformed(TelaInicial.java:76)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(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.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.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)

Mais uma vez agradeço qualquer ajuda.

6 Respostas

V

na linha 35 do seu model, você não criou a lista de usuários. Corrija o código para:

V

Agora o real problema:

Você está tentando inicializar seu modelo com:

Entretanto, a variável usuarios (do tipo UsuarioDAO), não foi inicializada em lugar nenhum.

NullPointerException tem um, e somente um, significado. Você está tentando usar uma variável que não iniciou (não deu “new” em lugar nenhum).

Note que a exception indica a classe que o problema ocorre e, no caso, é a ManUsuarios, na linha 114, dentro do construtor - init(ManUsuarios.java:114).
O Model nem sequer apareceu na StackTrace.

C

[quote=ViniGodoy]na linha 35 do seu model, você não criou a lista de usuários. Corrija o código para:

Obrigado pela resposta, mas ainda continua dando erro:

Mudei o código para:

public TableUsuarios (List&lt;Usuario&gt; lista) { this(); usuarios = new ArrayList&lt;Usuario&gt;(lista); }

:cry:

V

Consertou o que eu coloquei no post anterior também?

Se você chama o this podia só deixar com o addAll mesmo.

C

ViniGodoy:
Agora o real problema:

Você está tentando inicializar seu modelo com:

Entretanto, a variável usuarios (do tipo UsuarioDAO), não foi inicializada em lugar nenhum.

NullPointerException tem um, e somente um, significado. Você está tentando usar uma variável que não iniciou (não deu “new” em lugar nenhum).

Note que a exception indica a classe que o problema ocorre e, no caso, é a ManUsuarios, na linha 114, dentro do construtor - init(ManUsuarios.java:114).
O Model nem sequer apareceu na StackTrace.

SALVE ViniGodoy \0/, muito abrigado, funcionou perfeitamente!!!

E parabéns pelas respostas nos postes, pois estou aprendendo muito com você e outros colegas também!

V

CharlesEduardo:
SALVE ViniGodoy \0/, muito abrigado, funcionou perfeitamente!!!
E parabéns pelas respostas nos postes, pois estou aprendendo muito com você e outros colegas também!

De nada. Depois visita a minha lista de favoritos. Eu deixei ali váááárias respostas minhas para as perguntas que vivo respondendo.

Criado 17 de agosto de 2012
Ultima resposta 17 de ago. de 2012
Respostas 6
Participantes 2