[RESOLVIDO] exibir consulta mysql no próprio tablemodel

3 respostas
marcusluiz83

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!

3 Respostas

Marky.Vasconcelos

Voce nao precisa do setValueAt e addRow, basta usar o addSocio que voce implementou no seu TableModel.

marcusluiz83

Marky,

Obrigado pela ajuda, mas acho que não entendi direito. Fiz a alteração da seguinte forma:

private void mostraPesquisa(List<Socio> getSocios) {
        while (tm.getRowCount() > 0) {
            tm.removeSocio(0);
        }
tm.addSocio(); // method addSocio in class tabelas.SocioTableModel cannot be applied to given types
//  required: tabelas.Socio
//  found: no arguments
            }

Como devo corrigir? Obrigado!

marcusluiz83

Marky, dei uma vasculhada aqui no GUJ, e consegui resolver da seguinte forma com uma dica do ViniGodoy:

private void pesquisa() {
        SocioDAO dao = new SocioDAO();
        

        List<Socio> socios = dao.getLista();
        SocioTableModel model = new SocioTableModel (socios);
        tabela.setModel(model);
    }

Funcionou perfeitamente. É o fim do DefaultTableModel para mim. Tenho muitas delas pra eliminar nos meus projetos.

Muito obrigado, Marky e Vini!

Criado 21 de maio de 2011
Ultima resposta 21 de mai. de 2011
Respostas 3
Participantes 2