Problemas com evento MouseClicked

Boa noite galera, to com um probleminha sinistro aqui envolvendo JTable do tipo TableModel e Evento MouseClick, seguinte.: Tenho uma tela de alteração onde na JTable do tipo TableModel vem listados todos os dados do banco, tenho um busca incremental aqui que a medida que o usuario digita no Textfield ele vai filtrando na JTable, mas o problema é o seguinte, após o Usuario realizar a busca a os dados estarem filtrados na JTable, após ele clicar na JTable, os dados que vão para os Textfield são os que estavam na 1º posição da JTable, não os dados que estão filtrados…, ou seja, ele pega a linha da JTable em si, não a referencia da linha selecionada…, e tem um porem, quando eu clico em atualizar, atualiza os dados da 1ºlinha da JTable, ou seja, atualiza os dados que estão na 1º referencia da JTable não os que estão filtrados…será por que??? :cry:
Vo postar o Evento MouseClick que eu implementei… Obrigado

EVENTO MOUSE CLICK

[code] private void tabela_edita_usuariosMouseClicked(java.awt.event.MouseEvent evt) {

   int row = tabela_edita_usuarios.getSelectedRow();
   UsuarioModel model = (UsuarioModel)tabela_edita_usuarios.getModel();
   Usuario user = model.get(row);
   

   tf_nome.setText(user.getNome());
   tf_login.setText(user.getLogin());
   
} [/code]

Troque a linha 3 por:

int row = tabela_edita_usuarios.[url=“http://download-llnw.oracle.com/javase/6/docs/api/javax/swing/JTable.html#convertRowIndexToModel(int)”]convertRowIndexToModel/url;

ai viny, os dados foram certos para os Textfields, mas teve 2 porens, os dados não atualizaram em tempo de execução, e o outro é que depois que fechei e abrir a tela novamente, os dados que foram alterados foram os que constavam na 1º referencia da JTable, e não o que foi filtrado, quando os dados são filtrados eles aparecem na 1º referencia da JTable,ou seja primeira posição, sendo assim os dados que são alterados são os que aparecerem na 1º referencia da JTable listada pelo Banco… e não os que foram filtrados… parece que ele está pegando o ID dos Dados da 1º referenia da JTable, mesmo você filtrando ou não.
Mano isso é pro meu TCC, to ferrado… :frowning:
:frowning:

Viny, eu posso fazer o seguinte, essa sugestão que vc sugeriu está listando os dados correto nos textfields, mas não está alterando em tempo de execução, e quando abro e fecho a tela, os dados que foram alterados foram os que constavam na 1º referencia da JTable, eu acho que está alterando errado e não está alterando em tempo de execução por que meu método de alterar está pegando para alterar ao inves do ID , ele está pegando a Referencia da JTable selecionada… talvez podemos trocar a funcionalidade do método de alterar para alterar pelo ID da tupla da JTable ao invés de alterar pela referencia selecionada, sendo assim eu listo o ID da tupla da JTable num textfild e capturo ele na hora da alteração… mas ai tem que mudar o método, tentei mudar aqui mas continua não alterado em tempo de exexução, vo postar ele ai… ai vc muda pra mim para alterar em tempo de execução pegando como parametro o ID listado no Textfield???

MÉTODO QUE ALTERA

[code]private void bt_alterarActionPerformed(java.awt.event.ActionEvent evt) {

    if(evt.getSource() == bt_alterar){
        ContatoNegocio cont = new ContatoNegocio();
        int row = tabela.getSelectedRow();
          if(row != -1){
            ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
            Contato con = modelo.get(row);// O OBJETO "CON" VAI COMO PARAMETRO PARA O MÉTODO alterarContato, 
             // PARA DAR CERTO O QUE FALEI ACIMA, TINHA QUE IR ERA O ID LISTADO NO TEXTFILD, AO INVES DO OBJETO "CON"
            
            try {
                cont.alterarContato(con,tf_nome.getText(), tf_idade.getText(), tf_telefone.getText());
            } catch (SQLException ex) {
                Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
              modelo.fireTableDataChanged();
              
            JOptionPane.showMessageDialog(null,"Alterado com Sucesso!!");
          }else{
            JOptionPane.showMessageDialog(null,"Selecione um Campo para ser Alterado!");
          }
           
       
    }
}          [/code]

Deve ter algum método que captuda a referencia da linha que eu selecionar após realizar o filtro, ou seja, após realizar o filtro, pega a referencia da linha que foi filtrada, e não da 1º referencia listada pelo Banco de Dados na JTable, por que o método getSelectedRow(), captura a referencia do primeiro dado listado na JTable pelo método que preenche ela, neste caso, ele não funciona na minha aplicação, por que eu quero selecionar o indice da linha filtrada!!!

Você deve alterar pela referência do JTable mesmo. Só não esqueça de depois de fazer a alteração lançar o evento fireTableRowChanged indicando a linha do model que foi alterada.

Você tem que entender que quando trabalhamos com filtros, existem 2 números de linha diferentes. O da view, que está filtrado, e o do model, que tem todos os dados. Para converter um no outro, você precisar usar os métodos ConvertRowIndexToModel e ConvertRowIndexToView.

Quando você dispara um fire no model, deve usar a linha do model. A JTable então se encarrega de converter isso para a view e atualizar a informação. Evite ao máximo usar o fireTableDataChanged(), pois ele é muito custoso e obriga a JTable a se redesenhar inteira. Só use-o se, efetivamente, todos os dados mudaram.

Seu método deveria ser mais ou menos assim:

[code]private void bt_alterarActionPerformed(java.awt.event.ActionEvent evt) {
int viewRow = tabela.getSelectedRow();
if(viewRow == -1){
JOptionPane.showMessageDialog(null,“Selecione um Campo para ser Alterado!”);
return;
}

int modelRow = tabela.ConvertRowIndexToModel(viewRow);

ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
Contato con = tabela.modelo.get(modelRow);

try {
con.alterarContato(con,tf_nome.getText(), tf_idade.getText(), tf_telefone.getText());
} catch (SQLException ex) {
Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
}

modelo.fireTableRowsUpdated(modelRow, modelRow);
JOptionPane.showMessageDialog(null,“Alterado com Sucesso!!”);
}[/code]

Note que para funcionar, você precisa alterar o objeto do contato que está dentro do seu modelo. No seu código, você criava um novo objeto (sei lá pq) e deixava o do seu modelo sem modificar.

Ai Viny deu certinho cara, eu só tive que alterar alguma coisas como,
nesta parte do código que vc digitou aqui int modelRow = tabela.ConvertRowIndexToModel(row); o comando ConvertRowIndexToModel() estava recebendo como parametro uma variável row, mas ela não existia e sim a que vc tinha criado era a rowView, ai eu só passei a variável rowView para ele como parametro :mrgreen: … e a outra parte que tive que alterar foi na parte que vc chamou o model para atualizar a linha… você chamou o comando fireTableDataChanged(modelRow,modelRow); e passou parametros, mas esse método não aceita parametros então eu chamei o método model.fireTableRowsUpdated(modelRow, modelRow);, e aparetemente deu certo, agora eu te pergunto.: Essas alterações que eu fiz ta certo???

Obrigado por está me ajudando!!! :smiley:

:twisted:

Tão sim. Como sempre o problema é que eu faço de cabeça. Primeiro pq não tenho Java aqui na empresa. Depois, pq fiz em cima de seu código. :wink:

Ai viny mas agora aconteceu um outro problema, o evento mouseClick ele funciona quando ele quer, as vezes clico na tabela para jogar os dados para os textfields e eles vão, e as vezes sim, parece que o evento ta pesado e ta demorando ler os dados para serem lançados, será que ta faltando alguma coisa

[code] private void tabelaMouseClicked(java.awt.event.MouseEvent evt) {

    int row = tabela.convertRowIndexToModel(tabela.getSelectedRow());
    ContatoTableModel model = (ContatoTableModel)tabela.getModel();
    Contato con = model.get(row);

    tf_nome.setText(con.getNome());
    tf_idade.setText(con.getIdade());
    tf_telefone.setText(con.getTelefone());
}                                   [/code]

Use o depurador para ver o que tá acontecendo.

Certo, como eu faço para usar aqui no netbens?

[youtube]http://www.youtube.com/watch?v=joWldbcp1So[/youtube]

Vo testar:XD:

AI Vini eu passei o depurador e não aconteceu nada…, simplesmente apareceu a tela.