meyer
Outubro 30, 2018, 3:03am
#1
Boa noite,
Tenho um metodo atualizaTabela(), para quando eu acessar, salvar,editar e excluir no formulario atualize minha tabela.
Na minha pesquisa estou usando o jtUsuario.setModel(DbUtils.resultSetToTableModel (rs));
ai quando faço uma pesquisa os nomes da minhas colunas perde a formatação que fiz, ai as colunas da minha tabela pega os nomes da colunas do banco de dados.
Como faço para ao fazer a pesquisa não pegar os nome das colunas do banco ?
Cria seu próprio TableModel e só atualiza a coleção de objetos que ele renderiza.
meyer
Outubro 30, 2018, 3:55pm
#3
staroski eu criei sim o meu TableModel e esta funcionando direitinho, mas quando eu começo digitar o no JTexfILd de pesquisa e começa filtar a pesquisa ele perder a configuração do TableModel e assume a confuguralçao da tabela igual no banco de dados.
abaixo esta o método que atualiza a tabela, esta funcionando.
public void atualizaTabela(String sql){
ArrayList dados = new ArrayList();
String [] Colunas = new String[]{"ID","Nome","E-mail","Telefone","Usuário","Senha","Perfil","Status"};
try {
conexao = ConexaoDB.ConexaoMySQL.conector();
pst= conexao.prepareStatement(sql);
rs = pst.executeQuery();
rs.first();
do{
dados.add(new Object[]{rs.getInt("id"),rs.getString("nome"),rs.getString("email"),rs.getString("telefone"),rs.getString("usuario"),rs.getString("senha"),rs.getString("perfil"),rs.getString("status")});
}while(rs.next());
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "ERRO AO ATUALIZAR TABELA:\n " + e.getMessage());
System.out.println(e.getMessage());
}
ModelTabelaUsuario modelTabUso = new ModelTabelaUsuario(dados, Colunas);
jtUsuario.setModel(modelTabUso);
jtUsuario.getColumnModel().getColumn(0).setPreferredWidth(35);
jtUsuario.getColumnModel().getColumn(0).setResizable(false);
jtUsuario.getColumnModel().getColumn(1).setPreferredWidth(175);
jtUsuario.getColumnModel().getColumn(1).setResizable(false);
jtUsuario.getColumnModel().getColumn(2).setPreferredWidth(130);
jtUsuario.getColumnModel().getColumn(2).setResizable(false);
jtUsuario.getColumnModel().getColumn(3).setPreferredWidth(100);
jtUsuario.getColumnModel().getColumn(3).setResizable(false);
jtUsuario.getColumnModel().getColumn(4).setPreferredWidth(60);
jtUsuario.getColumnModel().getColumn(4).setResizable(false);
jtUsuario.getColumnModel().getColumn(5).setPreferredWidth(60);
jtUsuario.getColumnModel().getColumn(5).setResizable(false);
jtUsuario.getColumnModel().getColumn(6).setPreferredWidth(50);
jtUsuario.getColumnModel().getColumn(6).setResizable(false);
jtUsuario.getColumnModel().getColumn(7).setPreferredWidth(50);
jtUsuario.getColumnModel().getColumn(7).setResizable(false);
jtUsuario.setAutoResizeMode(jtUsuario.AUTO_RESIZE_OFF);
jtUsuario.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
E abaixo esta o método de pesquisa, quando uso ele peser a configuração do meu TableModel.
public void pesquisaUsuario(){
String sql = "select * from tbl_usuario where nome like ?";
try {
pst = conexao.prepareStatement(sql);
pst.setString(1, jtfPesquisa.getText() + '%');
rs = pst.executeQuery();
jtUsuario.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "ERRO AO PESQUISAR USUÁRIO:\n " + e.getMessage());
}
}
É que aqui você está usando um TableModel
:
ModelTabelaUsuario modelTabUso = new ModelTabelaUsuario(dados, Colunas);
jtUsuario.setModel(modelTabUso);
E aqui está trocando o TableModel
atual por um outro retornado pelo método DbUtils.resultSetToTableModel(rs)
:
jtUsuario.setModel(DbUtils.resultSetToTableModel(rs));
Utilize somente o primeiro e atualize o conteúdo do seu ArrayList dados
;
meyer
Outubro 30, 2018, 4:37pm
#5
Entendi mas como eu faço na hora de fazer minha opesquisa ?
Pois minha pesquisa funcionado assim: quando vou digitando vai filtrando na tabela apenas oque eu quero de acordo acom a ordem alfabetica que digito.
Da mesma forma que você faz no método atualizaTabela
, itera o ResultSet
e atualiza sua lista.
Supondo que seu TableModel
seja assim:
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class ModelTabelaUsuario extends AbstractTableModel {
private static final String[] COLUNAS = new String[] { "ID", "Nome", "E-mail", "Telefone", "Usuário", "Senha", "Perfil", "Status" };
private List<Usuario> dados = new ArrayList<>();
@Override
public int getColumnCount() {
return COLUNAS.length;
}
@Override
public String getColumnName(int col) {
return COLUNAS[col];
}
@Override
public int getRowCount() {
return dados.size();
}
@Override
public Object getValueAt(int lin, int col) {
if (lin < dados.size()) {
Usuario usuario = dados.get(lin);
switch (col) {
case 0:
return usuario.getId();
case 1:
return usuario.getNome();
case 2:
return usuario.getEmail();
case 3:
return usuario.getTelefone();
case 4:
return usuario.getUsuario();
case 5:
return usuario.getSenha();
case 6:
return usuario.getPerfil();
case 7:
return usuario.getStatus();
}
}
return null;
}
/**
* Este método você vai utilizar para atualizar o conteúdo da JTable
*/
public void setDados(List<Usuario> dados) {
this.dados = dados;
fireTableDataChanged();
}
}
Basta você intanciar seu JTable
assim:
jtUsuario = new JTable(new ModelTabelaUsuario());
jtUsuario.getColumnModel().getColumn(0).setPreferredWidth(35);
jtUsuario.getColumnModel().getColumn(0).setResizable(false);
jtUsuario.getColumnModel().getColumn(1).setPreferredWidth(175);
jtUsuario.getColumnModel().getColumn(1).setResizable(false);
jtUsuario.getColumnModel().getColumn(2).setPreferredWidth(130);
jtUsuario.getColumnModel().getColumn(2).setResizable(false);
jtUsuario.getColumnModel().getColumn(3).setPreferredWidth(100);
jtUsuario.getColumnModel().getColumn(3).setResizable(false);
jtUsuario.getColumnModel().getColumn(4).setPreferredWidth(60);
jtUsuario.getColumnModel().getColumn(4).setResizable(false);
jtUsuario.getColumnModel().getColumn(5).setPreferredWidth(60);
jtUsuario.getColumnModel().getColumn(5).setResizable(false);
jtUsuario.getColumnModel().getColumn(6).setPreferredWidth(50);
jtUsuario.getColumnModel().getColumn(6).setResizable(false);
jtUsuario.getColumnModel().getColumn(7).setPreferredWidth(50);
jtUsuario.getColumnModel().getColumn(7).setResizable(false);
jtUsuario.setAutoResizeMode(jtUsuario.AUTO_RESIZE_OFF);
jtUsuario.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
Crie um método para atualizar seu TableModel
a partir de um ResultSet
:
private void atualizaTableModel(ResultSet rs) throws SQLException {
List<Usuario> dados = new ArrayList<>();
while (rs.next()) {
Usuario usuario = new Usuario();
usuario.setId(rs.getInt("id"));
usuario.setNome(rs.getString("nome"));
usuario.setEmail(rs.getString("email"));
usuario.setTelefone(rs.getString("telefone"));
usuario.setUsuario(rs.getString("usuario"));
usuario.setSenha(rs.getString("senha"));
usuario.setPerfil(rs.getString("perfil"));
usuario.setStatus(rs.getString("status"));
dados.add(usuario);
}
ModelTabelaUsuario tableModel = (ModelTabelaUsuario) jtUsuario.getModel();
tableModel.setDados(dados);
}
E daí os métodos para atualizar e pesquisar ficam assim:
public void atualizaTabela(String sql) {
try {
PreparedStatement pst = conexao.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
atualizaTableModel(rs);
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "ERRO AO ATUALIZAR TABELA:\n " + e.getMessage());
}
}
public void pesquisaUsuario() {
try {
String sql = "select * from tbl_usuario where nome like ?";
PreparedStatement pst = conexao.prepareStatement(sql);
pst.setString(1, jtfPesquisa.getText() + '%');
ResultSet rs = pst.executeQuery();
atualizaTableModel(rs);
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "ERRO AO PESQUISAR USUÁRIO:\n " + e.getMessage());
}
}
meyer
Outubro 30, 2018, 5:16pm
#8
Obrigado, vou verificar esses codigos.
Valeu.
Eu dei uma alterada no código postado pra ficar mais fácil.