Bom dia!
Tô tentando largar a DefaultTableModel, criando o próprio tablemodel e tô entendendo direito como se aplica a modelagem de acordo com o que a gente precisa, e consegui implementa-la normalmente, porém, ainda não consegui exibir o resultado de uma consulta mysql nela.
Pegue esta tablemodel aqui no GUJ (SocioTableModel.java):
package tabelas;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
/**
* Implementação de Table Model para exibir os Sócios.
*
* @author Eric Yuzo
*/
public class SocioTableModel extends AbstractTableModel {
/* Lista de Sócios que representam as linhas. */
private List<Socio> linhas;
/* Array de Strings com o nome das colunas. */
private String[] colunas = new String[] {
"Nome", "Telefone", "Data de Cadastro", "Mensalidade"};
/* Cria um SocioTableModel vazio. */
public SocioTableModel() {
linhas = new ArrayList<Socio>();
}
/* Cria um SocioTableModel carregado com
* a lista de sócios especificada. */
public SocioTableModel(List<Socio> listaDeSocios) {
linhas = new ArrayList<Socio>(listaDeSocios);
}
/* 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 String.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 Date.class;
case 3: // Quarta coluna é a mensalidade, um double.
return Double.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.
Socio socio = 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 socio.getNome();
case 1: // Segunda coluna é o telefone.
return socio.getTelefone();
case 2: // Terceira coluna é a data de cadastro.
return socio.getDataDeCadastro().getTime();
case 3: // Quarta coluna é a mensalidade.
return socio.getMensalidade();
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 Socio getSocio(int indiceLinha) {
return linhas.get(indiceLinha);
}
/* Adiciona um registro. */
public void addSocio(Socio socio) {
// Adiciona o registro.
linhas.add(socio);
// 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);
}
/* 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 addListaDeSocios(List<Socio> socios) {
// Pega o tamanho antigo da tabela.
int tamanhoAntigo = getRowCount();
// Adiciona os registros.
linhas.addAll(socios);
// 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();
}
}
Meu método DAO:
package tabelas;
import conexao.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author marcus
*/
public class SocioDAO {
// Cria a conexão com o banco de dados
private Connection connection;
public SocioDAO() {
try {
this.connection = new ConnectionFactory().getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public List<Socio> getLista() {
try {
List<Socio> socios = new ArrayList<Socio>();
PreparedStatement stmt = this.connection.prepareStatement("select * from socio");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Socio s = new Socio();
s.setNome(rs.getString("nome"));
s.setDataDeCadastro(rs.getDate("dataCadastro"));
s.setMensalidade(rs.getDouble("mensalidade"));
s.setTelefone(rs.getString("telefone"));
// Adicionando o objeto à lista
socios.add(s);
}
rs.close();
stmt.close();
return socios;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
O método que busca a lista no JButton:
private void pesquisa() {
SocioDAO dao = new SocioDAO();
socios = dao.getLista();
mostraPesquisa(socios);
}
E como eu exibia na DefaultTableModel, e não sei como criar os métodos addRow e removeRow da defaultTableModel:
private void mostraPesquisa(List<Socio> listaSocios) {
while (tm.getRowCount() > 0) {
tm.removeRow(0); // Como ficaria esse método na tablemodel???
}
String[] linha = new String[]{null, null, null};
for (int i = 0; i < socios.size(); i++) {
tm.addRow(linha); // Como ficaria esse método na tablemodel???
tm.setValueAt(socios.get(i).getNome(), i, 0);
tm.setValueAt(socios.get(i).getTelefone(), i, 1);
tm.setValueAt(socios.get(i).getDataDeCadastro(), i, 2);
tm.setValueAt(socios.get(i).getMensalidade(), i, 3);
}
}
Agradeço pela ajuda!