JTable, JtextField e resultSet

Boa tarde!

Pessoal to com um problema que não encontrei em nenhum topico e é bem estranho, pelo menos para min:

Tenho um JFrame com algum jtext e uma jTable e uma conexão com banco, precisava setar os dados da linha selecionada no Jtable (que carregas os dados de uma tabela) nos jText, fiz da seguinte maneira:

[code]private void jTableClientesMouseClicked(java.awt.event.MouseEvent evt) { // evento do click do mause

    int codigo = Integer.parseInt(jTableClientes.getModel().getValueAt(jTableClientes.getSelectedRow(), 0).toString());// pegar a referencia onde o usuario clickou
          
    try {
        conClientes.resultset.first();// posiciona no primeiro registro do resultset
        while (conClientes.resultset.getInt("codigo")!=codigo){ // procura até que encontre no resultset coluna "codigo" o valor de referencia do click do usuario
            conClientes.resultset.next(); // vai para o proximo registro do resultset
        }
        mostrarDados();// set os valores do resulSet nos jTextField
    } catch (SQLException ex) {
        Logger.getLogger(telaClientes.class.getName()).log(Level.SEVERE, null, ex);
    }
}[/code]

O codigo ai encima faz uma consulta no resultset (que carrega a tabela clientes inteira) até achar um valor igual a linha e coluna selecionada na jTable.

O codigo acha o valor sem problemas, mas depois quando executo o metodo mostrarDados() que tem a seguinte linha:

[code]public void mostrarDados() throws SQLException{

    try{
        jTextFieldCodigoClientes.setText(conClientes.resultset.getString("codigo"));// nesta linha ocorre o erro se eu a comentar os outros set funcionam normalmente
        // ... existem n jTextField sendo setados todos funcionam normalmente menos este que realizo a consulta 
   } catch (SQLException ex) {
        Logger.getLogger(telaClientes.class.getName()).log(Level.SEVERE, null, ex);
    }

}[/code]

Aparentemente quando uso o método conClientes.resultset.getInt(“codigo”) ele limpa esta coluna do resultset. Ai quando tento setar ela da o erro “dados não encontrados”. Ai quando eu comento esta linha tudo se resolve.

Bom se alguém poder me ajudar explicando por que ocorre isto!!

Grato,
Murillo Pontes

printStackTrace()

E que ele não deixa eu usar IOException, da erro de compilação:

Exception in thread “AWT-EventQueue-0” java.lang.RuntimeException: Uncompilable source code - exception java.io.IOException is never thrown in body of corresponding try statement

Olá Murillo, só uma sugestão. Em vez de dar um loop na tabela de Clientes procurando pelo codigo (linha clicada no JTable), por que você não cria um método para retornar um Cliente à partir da variável codigo? Em seguida com o objeto retornado seria só setar cada propriedade do objeto nos JTextFields desejados.

Osni o problema é que estou retornando em uma tela de cadastro que possue botões proximo, anterior, ultimo e primeiro, então deste modo que fiz, na hora que o usuario clica na jtable ele carrega o registro e se depois ele clicar no proximo ele anda o ponteiro no resultset de maneira correta. E pelo que entendi se eu fizer desta maneira ele retornara apenas um cliente, se por um acaso alguem clicar no botão proximo terei que fazer outro select na tabela.

Estude como o TableModel funciona. Se você fizer o seu próprio tableModel, todas as suas dúvidas serão resolvidas. Sem falar que seu código vai ficar mais limpo, mais organizado e menos trabalhoso.

Bom dia!

Vou fazer isto agora, seu que aki tem muitos topicos de como implementar meu proprio tableModel.

Entretanto acho que este erro não é do tableModel e sim algo no resultset, ja que só ocorre quando tento ler o resultset depois do evento mouseClicked.

Bom sera que não é por que estou pegando o resultado do resultset com getInt no while:

while (conClientes.resultset.getInt("codigo")!=codigo){ // procura até que encontre no resultset coluna "codigo" o valor de referencia do click do usuario   

E depois com getString:

jTextFieldCodigoClientes.setText(conClientes.resultset.getString("codigo"));// nesta linha ocorre o erro se eu a comentar os outros set funcionam normalmente  

Retire a linha do first. Ela só funciona para resultsets que forem criados como navegáveis.
A maior parte dos resultsets são forwardonly.

Outra coisa, são boas práticas:

  1. Separar o código que monta suas classes (DAOs), do código da inteface gráfica;
  2. Criar classes de negócio para representar os dados;
  3. Fechar conexões, resultsets e statements em blocos finally;
  4. Fazer buscas por ID através da cláusula WHERE do banco, ao invés de percorrer a classe de negócio diretamente (se vc realmente precisar carregar a lista da classe de negócio e fazer buscas por id, é uma boa criar um map do ID para o objeto de negócio em si);
  5. Implementar seu próprio TableModel.

Lembre-se também que o next() pode retornar false, indicando que não há mais linhas a percorrer.