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