Olá pessoal,
Alguém sabe como atualizar uma tabela de um banco de dados utilizando um JTable?
Ou seja, o usuário faz uma busca no banco e retorna dentro de um JTable, até ai tudo bem.
Mas quando faz as alterações necessárias, tenho que enviar novamente para o banco.
Como faz o UPDATE?
Caso saibam de algum tutorial que possa me ajudar, fico Grato.
Desde já agradeço.
Abraços.
Alguém dê um luz!
veja se isso te ajuda em algo: http://www.go-java.com/blog/2007/09/27.html
não é exatamente o que você quer, mas no caso você pediu uma :idea: então já alguma coisa.
incrementando o post acima, poderia colocar botões de comando para realizar as operações no banco de dados e recarregar o JTable…em todo caso, se de nada servir o conteúdo, posta mais detalhes do que quer fazer.
[quote=rafaelglauber]veja se isso te ajuda em algo: http://www.go-java.com/blog/2007/09/27.html
não é exatamente o que você quer, mas no caso você pediu uma :idea: então já alguma coisa.
:)[/quote]
Olá rafaelglauber,
Cara um artigo muito bom, porém realmente não era bem isso que estou querendo.
Mas de qualquer forma irei dar uma olhada mais aprofundada, pois o assunto é interessante.
Com relação a:
Bom, realmente eu utilizo um evento de um JButton para carregar o JTable até aqui funciona perfeitamente.
O meu problema é quando o usuário faz as alterações na JTable ele clica em outro JButton para que estas atualizações sejam enviadas para o banco.
Ou seja, o meu problema se resume em como enviar os dados do JTable atualizados para o banco de dados.
Caso tenha alguma outra idéia de como posso resolver isso, ficarei eternamente grato.
Desde já agradeço
T+
Você tá usando algum framework orm? Tá usando jdbc puro?..como faz a persistência de sua aplicação?
JDBC puro mesmo,
Utilizo um evento de um JButton ao qual dentro deste evento faço a conexão com o banco.
O código que estou tentando é algo + ou - assim:
private void editarJurLancamentos(java.awt.event.ActionEvent evt) {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/gerpro";
String usuario = "root";
String senha = "admin";
Connection con;
con = DriverManager.getConnection(url, usuario, senha);
PreparedStatement ps = con.prepareStatement("UPDATE lancamentosjuridico SET condominio = ? , unidade = ? , servico = ? , hora = ? , data = ? , contato = ? , comentario =?");
ps.setString(1 , aqui não sei como setar o campo da JTable);
ps.setString(2 , aqui não sei como setar o campo da JTable);
ps.setString(3 , aqui não sei como setar o campo da JTable);
ps.setString(4 , aqui não sei como setar o campo da JTable);
ps.setString(5 , aqui não sei como setar o campo da JTable);
ps.setString(6 , aqui não sei como setar o campo da JTable);
ps.setString(7 , aqui não sei como setar o campo da JTable);
ps.executeUpdate();
con.close();
}catch (ClassNotFoundException e ){
JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
}
Bom na consulta eu fiz assim:
[code]
private void abrirEditarJurLancamentos(java.awt.event.ActionEvent evt) {
editarJurLancamentos.setExtendedState(JFrame.MAXIMIZED_BOTH);
editarJurLancamentos.setVisible(true);
comboJurEdiLancCondominio.removeAllItems();
comboJurEdiLancServico.removeAllItems();
preencherComboJurServicos();
preencherComboJurCondominios();
redimencionarColumasLancJuridico();
DefaultTableModel modelo = (DefaultTableModel)jtJurEdiLancTabela.getModel();//obtem o tablemodel da tabela
//Limpando os campos da tabela antes de inserir os dados da consulta
int i = 0;
while (modelo.getRowCount() > 0){
modelo.removeRow(i);
}
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/gerpro";
String usuario = "root";
String senha = "admin";
Connection con;
con = DriverManager.getConnection(url, usuario, senha);
PreparedStatement ps = con.prepareStatement("SELECT * FROM lancamentosjuridico");
ResultSet rs = ps.executeQuery();
while (rs.next()){
Object[] novaLinha = new Object[7];//cria um array de objetos com a quantidade igual as colunas da table
novaLinha[0] = rs.getString("condominio");
novaLinha[1] = rs.getString("unidade");
novaLinha[2] = rs.getString("servico");
novaLinha[3] = rs.getString("hora");
novaLinha[4] = rs.getString("data");
novaLinha[5] = rs.getString("contato");
novaLinha[6] = rs.getString("comentario");
modelo.addRow( novaLinha );//adiciona uma nova linha ao tablemodel da tabela
}
con.close();
}catch (ClassNotFoundException e ){
JOptionPane.showMessageDialog(null, "Falha na conexão com o banco de dados.\n" + e.getMessage());
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
}[/code]
Bom, eu na verdade queria atualizar tabela toda e não os campos como citei em cima. //ali é só um idéia
Porque o usuário pode atualizar mais de um campo por vez.
Caso saiba de alguma solução, fico eternamente grato.
Agradeço a força desde então!
Abraços
Cara eu nao entendi bem este “aqui não sei como setar o campo da JTable”
....................
ps.setString(1 , aqui não sei como setar o campo da JTable);
ps.setString(2 , aqui não sei como setar o campo da JTable);
ps.setString(3 , aqui não sei como setar o campo da JTable);
ps.setString(4 , aqui não sei como setar o campo da JTable);
ps.setString(5 , aqui não sei como setar o campo da JTable);
ps.setString(6 , aqui não sei como setar o campo da JTable);
ps.setString(7 , aqui não sei como setar o campo da JTable);
.....................................................
Voce nao sabe pegar os campos da tabela ? é isso ?
int row = jTable1.getSelectedRow();
int col = jTable1.getSelectedColumn();
String camposel=jTable1.getValueAt(row, col).toString();
No seu caso precisa saber qual coluna fixar e ir variando as linhas!!!
Olá Raarm,
Estou tentando de outra maneira,
Mas o código que me enviou:
int row = jTable1.getSelectedRow();
int col = jTable1.getSelectedColumn();
String camposel=jTable1.getValueAt(row, col).toString();
É para acessar uma única célula, correto?
Se sim, como faço para pegar a linha toda ao invés de uma única célula e obter as strings das colunas dessa linha.
Valeu a força,
Abraços
Entao Wesley…para vc pegar uma linha inteira e só fixar a linha:
String camposel=jTable1.getValueAt(0, col).toString(); //primeira linha
ou para coluna:
ou entao faz um for…pra pegar todas as linhas
[quote=Raarm]Entao Wesley…para vc pegar uma linha inteira e só fixar a linha:
String camposel=jTable1.getValueAt(0, col).toString(); //primeira linha
ou para coluna:
ou entao faz um for…pra pegar todas as linhas
:P[/quote]
depois como faria para pegar cada elemendo contido nas colunas dessa linha?
teria que colocar em um array?
vlw
Entao vc pode fazer assim, cria um array dados[][]
for(int col=0;col<6;col++)
{
for(int lin=0;lin<modelo.size();lin++)
{
dados[lin][col]=jTable1.getValueAt(lin, col).toString();
}
}
>
[quote=Raarm]Entao vc pode fazer assim, cria um array dados[][]
for(int col=0;col<6;col++)
{
for(int lin=0;lin<modelo.size();lin++)
{
dados[lin][col]=jTable1.getValueAt(lin, col).toString();
}
}
>[/quote]
Valeu Raarm,
Vou testar depois eu posto o resultado
Abraços
Olá Raarm,
Não sei se estou fazendo o correto, pois tá dando o erro :
[color=red]Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException[/color]
Se puder dá uma olhada no código,
A idéia seria um evento de um JButton ao qual na seleção de uma linha na JTable e clicando no JButton “OK” as colunas da linha selecionada da JTable fosse para os JTextfields.
o código é seguinte:
private void editarJurLancamentos(java.awt.event.ActionEvent evt) {
DefaultTableModel modelo = (DefaultTableModel)jtJurEdiLancTabela.getModel();//obtem o tablemodel da tabela
jtJurEdiLancTabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //permite selecionar apenas uma linha da tabela
int lin = jtJurEdiLancTabela.getSelectedRow();
int col = jtJurEdiLancTabela.getSelectedColumn();
String dados [][] = null;
for(col=0;col<6;col++){
for(lin=0;lin<modelo.getRowCount();lin++){
dados[lin][col]=jtJurEdiLancTabela.getValueAt(lin, col).toString();
}
}
cxTxtJurLancUnidade.setText(dados[lin][2]);
cxTxtJurLancHorario.setText(dados[lin][4]);
cxTxtJurLancContatoCom.setText(dados[lin][5]);
cxTxtJurLancComentarios.setText(dados[lin][6]);
juridicoLancamentos.setVisible(true);
}
Valeu mesmo a força
É que tô apanhando muito com JTable
Abraço
Eai Wesley…entao cara se vc quer pegar só as colunas da linha é o seguinte…
int colunas[] = jtJurEdiLancTabela.getSelectedColumns(); //pega as colunas selecionadas, no seu caso sao 6
int linha = jtJurEdiLancTabela.getSelectedRow(); //pega a linha selecionada
String dados[] = new String[colunas.length];
for(int i=0;i<colunas.length;i++)
{
dados[i] = jtJurEdiLancTabela.getValueAt(linha, i).toString();
}
.........
cxTxtJurLancUnidade.setText(dados[2]);
cxTxtJurLancHorario.setText(dados[4]);
cxTxtJurLancContatoCom.setText(dados[5]);
cxTxtJurLancComentarios.setText(dados[6]);
Acho que assim resolve…ve ai!! 8) >
Valeu Raarm,
Vou tentar mais tarde e te falo, é que no momento eu não tenho como testa, estou sem o projeto aqui.
Mas, desde já agradeço a força.
Abração
Blza Wesley…a parte de atualizar no banco eu tb to implementando algo parecido aqui no meu projeto…qqr coisa te dou uma força!!!
Abraço
Raphael
Grande Raphael,
Funcionou
Cara, tô te devendo essa.
Só tive que alterar uma coisinha:
int colunas[] = jtJurEdiLancTabela.getSelectedColumns(); //pega as colunas selecionadas
int linha = jtJurEdiLancTabela.getSelectedRow(); //pega a linha selecionada
String dados[] = new String[7];
int i=0;
for(i=0;i<7;i++){
dados[i] = jtJurEdiLancTabela.getValueAt(linha, i).toString();
}
Ele não quis funcionar com colunas.length
Dava erro de indexação.
Então eu coloquei a quantidade de colunas mesmo, que na verdade são 7
Não é o certo mas funcionou.
Aproveitando o gancho e já abusando, :oops:
Como faria se tivesse que comparar um indice desse array com um item de um JComboBox para deixá-lo selecionado?
É que já tô pensando em uma problema mais na frente.
Brigadaum mesmo.
T+
Resolvido o Problema do Combo, é que eu tenho um método para preenche-lo é táva executando ele 2 vezes então ele duplicava os valores.
Valeu Raphael.
T+