Bom dia pessoal.
Estou estudando e procurando inserir colunas e dados em um jTable mas não está dando certo. Nem as colunas e nem os dados estão sendo apresentado nem de forma estática e nem através de um DefaultTableModel. É um assunto muito visto nos fóruns e com relação as colunas todas as informações é que o jTable dev ser inserido em um ScrollPane. Mas não está dando, não só as colunas, mas as linhas com dados também não estão sendo apresentadas. Vou postar o que fiz apenas de forma estática para simplificar.
Tenhos um classe ListarContato com as seguintes rotinas de um artigo da web:
JPanel painelFundo;
JTable tabela;
JScrollPane barraRolagem;
Object [][] dados = {
{"Ana Monteiro", "48 9923-7898", "ana.monteiro@gmail.com"},
{"João da Silva", "48 8890-3345", "joaosilva@hotmail.com"},
{"Pedro Cascaes", "48 9870-5634", "pedrinho@gmail.com"}
};
String [] colunas = {"Nome", "Telefone", "Email"};
public void criarJanela(){
painelFundo = new JPanel();
painelFundo.setLayout(new GridLayout(1, 1));
JTable tabela = new JTable(dados,colunas);
barraRolagem = new JScrollPane(tabela);
painelFundo.add(barraRolagem);
getContentPane().add(painelFundo);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(900, 400);
setVisible(true);
}
Em um botão Chamo o metodo criarJanela.
Agradeço pela ajuda.
Bom dia. Se for da forma que vc está fazendo é bem simples.
private void BuscarNewUser() {
String[][] dados = {
{"Ana Monteiro", "48 9923-7898", "ana.monteiro@gmail.com"},
{"João da Silva", "48 8890-3345", "joaosilva@hotmail.com"},
{"Pedro Cascaes", "48 9870-5634", "pedrinho@gmail.com"}
};
DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
model.setNumRows(0);
for (int i = 0; i < dados.length; i++) {
String[] linha = {dados[i][0], dados[i][1], dados[i][2]};
model.addRow(linha);
}
}
------- para meu Jtable fiz assim: ----
jTable1 = new javax.swing.JTable();
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
“Nome”, “telefone”, “email”
}
));
jScrollPane3.setViewportView(jTable1);
Gustavo obrigado pela ajuda e desculpe por demorar para responder.
Analizando o código que você postou e outros artigos da web, vai pra lá e vem prá cá, tenta assim, tenta de novo e consegui preencher o nome das colunas e preencher as linhas com dados gravados no bd, que é o que eu realmente preciso. Já é alguma coisa.Fiz através do DefaultTableModel. Mas ainda tem problema mesmo dessa forma, apesar do avanço: O registro apresentado na tabela é o último registro da tabela do bd. Esse registro é apresentado tantas vezes quanto for o número de registros gravados. O código é o abaixo:
private DefaultTableModel modelo = new DefaultTableModel();
private void criaJTable() {
tabela = new JTable(modelo);
jTable1.setModel(modelo);
modelo.addColumn(“Id”);
modelo.addColumn(“Nome”);
modelo.addColumn(“Telefone”);
modelo.addColumn(“Email”);
tabela.getColumnModel().getColumn(0).setPreferredWidth(10);
tabela.getColumnModel().getColumn(1).setPreferredWidth(120);
tabela.getColumnModel().getColumn(1).setPreferredWidth(80);
tabela.getColumnModel().getColumn(1).setPreferredWidth(120);
JScrollPane scrollpane = new JScrollPane(tabela);
getContentPane().add(scrollpane);
pesquisar(modelo);
}
public static void pesquisar(DefaultTableModel modelo) {
modelo.setNumRows(0);
ContatoDao dao = new ContatoDao();
for (Contato c: dao.getContatos()) {
modelo.addRow(new Object[]{c.getId(), c.getNome(), c.getTelefone(), c.getEmail()});
}
}
Sei que depois de entender DefaultTableModel é preciso dominar o AbstractTableModel. Obrigado pela atenção de todos.
O problema deve estar no método getContatos
da classe ContatoDao
.
Provavelmente você só está instanciando um único Contato
, alterando ele a cada iteração e adicionando novamente na lista.
staroski, obrigado pela atenção e ajuda.
A recuperação dos dados no bd está sendo feitas da seguinte forma:
private final String LIST = “SELECT * FROM CONTATO”;
public List getContatos() {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
ArrayList contatos = new ArrayList();
try {
conn = FabricaConexao.getConexao();
pstm = conn.prepareStatement(LIST);
rs = pstm.executeQuery();
while (rs.next()) {
Contato contato = new Contato();
contato.setId(rs.getInt("id"));
contato.setNome(rs.getString("nome"));
contato.setTelefone(rs.getString("telefone"));
contato.setEmail(rs.getString("email"));
contatos.add(contato);
JOptionPane.showMessageDialog(null, "Consulta realizada com sucesso kkkkk!");
}
FabricaConexao.fechaConexao(conn, pstm, rs);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Erro ao listar contatos" + e.getMessage());
}
return contatos;
}
Não estou conseguindo localizar o problema! Agradeço a ajuda.
Então irmãozinho… Esse treco de array bidimensional é meio treta kkkk
É um chute, pois não ando tão afiado com o basicão, mas aqui você não parece estar instanciando um array, pois você é obrigado a dizer o tamanho do seu array:
modelo.addRow(new Object[]{c.getId(), c.getNome(), c.getTelefone(), c.getEmail()});
na minha humilde opinião quando vc usa a palavra reservada “new” pra criar um array vc deve fazer desse jeito:
Object[] linha = new Object[4];
linha[0] = c.getId();
linha[1] = c.getNome();
linha[2] = c.getTelefone();
linha[3] = c.getEmail();
Um array primitivo sempre tem tamanho fixado na sua criação, ou seja, você deve passar o tamanho dele, e esse valor não muda! quando você quer um array dinâmico geralmente é usado List… Mas se vc quer ser um psicopata do primitivo nada te impede de fazer um array recursivo kkkk