Problemas de navegação em registro usando JDBC com MySQL

Cordiais saudações, povo do GUJ.

Tenho um programa que navega em registros de uma tabela (MySQL) chamada filmes. Porém a unica opção que funciona é “ver próximo registro”. As demais opções que o navegador fornece são: ver registro anterior, avançar 10 registros, voltar 10 registros, ir para o primeiro registro e ir para o último registro:

A tela do navegador é esta que está no print abaixo:

image

Ele sempre mostra a mesma mensagem de erro para todas as cinco operações que não estão funcionando. A mensagem de erro é a que segue no prints abaixo:

Aqui vai o código do programa inteiro, (ele usa uma classe chamada BD que faz a conexão e não está dando problema). Não sei, mas acredito que seja alguma configuração que não fiz e deveria ter feito.

Parece que o problema é em um objeto chamado resultSet, da classe ResultSet, que armazena os dados da busca. Se alguém souber o que devo fazer para corrigir esses erros, por favor, me diga.

Obrigadão, atenciosamente,
Ronaldo

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cap12;

import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class NavegaFilmes extends JFrame {
    
    private JLabel label1, label2, label3, label4, label5;
    private JButton btProximo, btAnterior, btPrimeiro, btUltimo, btMais10, btMenos10, btSair;
    private JTextField tfCodigo, tfTitulo, tfGenero, tfProdutora, tfDatCom;
    private BD bd;
    private PreparedStatement statement;
    private ResultSet resultSet;
    
    public static void main(String args[]) {
        JFrame frame = new NavegaFilmes();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    public NavegaFilmes() {
        inicializarComponentes();
        definirEventos();
    }
    
    public void inicializarComponentes() {
        setLayout(new FlowLayout(FlowLayout.LEFT));
        label1 = new JLabel("Código ");
        label2 = new JLabel("Título");
        label3 = new JLabel("Gênero");
        label4 = new JLabel("Produtora");
        label5 = new JLabel("Data da Compra ");
        tfCodigo = new JTextField(10);
        tfTitulo =  new JTextField(35);
        tfGenero = new JTextField(10);
        tfProdutora = new JTextField(15);
        tfDatCom = new JTextField(8);
        btProximo = new JButton(null, new ImageIcon("c:/icones/icon12/proximo.gif"));
        btProximo.setToolTipText("Próximo");
        btAnterior = new JButton(null, new ImageIcon("c:/icones/icon12/anterior.gif")); 
        btAnterior.setToolTipText("Anterior");
        btPrimeiro = new JButton(null, new ImageIcon("c:/icones/icon12/primeiro.gif"));
        btPrimeiro.setToolTipText("Primeiro");
        btUltimo = new JButton(null, new ImageIcon("c:/icones/icon12/ultimo.gif"));
        btUltimo.setToolTipText("Último");
        btMais10 = new JButton(null, new ImageIcon("c:/icones/icon12/mais.png"));
        btMais10.setToolTipText("+10");
        btMenos10 = new JButton(null, new ImageIcon("c:/icones/icon12/menos.png"));
        btMenos10.setToolTipText("-10");
        btSair = new JButton(null, new ImageIcon("c:/icones/icon12/sair.png"));
        btSair.setToolTipText("Sair");
        add(label1);
        add(tfCodigo);
        add(label2);
        add(tfTitulo);
        add(label3);
        add(tfGenero);
        add(label4);
        add(tfProdutora);
        add(label5);
        add(tfDatCom);
        add(btPrimeiro);
        add(btAnterior);
        add(btProximo);
        add(btUltimo);
        add(btMais10);
        add(btMenos10);
        add(btSair);
        setTitle("Navegação na tabela de Filmes");
        setBounds(200, 400, 620, 120);
        setResizable(false);
        bd = new BD();
        if(!bd.getConnection()) {
            JOptionPane.showMessageDialog(null, "Falha ao conectar, o sistema será fechado!");
            System.exit(0);
        }
        carregarTabela();
        atualizarCampos();
    }
    
    public void definirEventos() {
        
        btProximo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    resultSet.next();
                    atualizarCampos();
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
            }
        });
        
        btAnterior.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    resultSet.previous();
                    atualizarCampos();
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
            }
        });
        
        btPrimeiro.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    resultSet.first();
                    atualizarCampos();
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
            }
        });
        
        btUltimo.addActionListener(new ActionListener () {
            public void actionPerformed(ActionEvent e) {
                try {
                    resultSet.last();
                    atualizarCampos();            
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
            }
        });
        
        btMais10.addActionListener(new ActionListener () {
            public void actionPerformed(ActionEvent e) {
                try {
                    resultSet.relative(10);
                    atualizarCampos();            
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
            }
        });
        
        btMenos10.addActionListener(new ActionListener () {
            public void actionPerformed(ActionEvent e) {
                try {
                    if(resultSet.getRow() > 10) {
                        resultSet.relative(-10);
                    } else {
                        resultSet.first();
                    } 
                    atualizarCampos();            
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
            }
        });
        
        btSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    resultSet.close();
                    statement.close();
                } catch(SQLException erro) {
                    JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
                }
                bd.close();
                System.exit(0);
            }
        });
        
    }
    
    public void carregarTabela() {
        String sql = "select * from filmes";
        try {
            statement = bd.connection.prepareStatement(sql);
            resultSet = statement.executeQuery();
        } catch(SQLException erro) {
            JOptionPane.showMessageDialog(null, "Erro! " + erro.toString());
        }
    }
    
    public void atualizarCampos() {
        try {
            if(resultSet.isAfterLast()) {
                resultSet.last();
            }
            if(resultSet.isBeforeFirst()) {
                resultSet.first();
            }
            tfCodigo.setText(resultSet.getString("codigo"));
            tfTitulo.setText(resultSet.getString("titulo"));
            tfGenero.setText(resultSet.getString("genero"));
            tfProdutora.setText(resultSet.getString("produtora"));
            tfDatCom.setText("" + resultSet.getDate("datacompra"));
        } catch(SQLException erro) {
        }
    }
    
}

Tente criar o Statement* assim:

statement = bd.connection.prepareStatement(
    sql,
    ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_READ_ONLY
);

Isso irá fazer com que vc consiga “voltar” nos registros do ResultSet.

FONTE: Connection#prepareStatement(String, int, int)

1 curtida