Caros colegas, encontrei uma solução que está funcionando. Provavelmente há formas "melhores" de resolver este problema, mas estou considerando minha solução como uma medida paliativa (principalmente por ser iniciante).
1 - Passei a utilizar sobrecarga no método que recupera as informações e as armazena no ResultSet:
private void PreencherResultSet(){
try {
String sql = "Select * from cidade";
stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rst = stm.executeQuery();
rst.first();
MostrarDados();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex);
}
}
E:
private void PreencherResultSet(String direcao,int id){
String sql = null;
try {
if(direcao == "voltar")
sql = "select * from cidade where codigo = (select max(codigo)from cidade where codigo < "+id+")";
else
sql = "select * from cidade where codigo = (select min(codigo)from cidade where codigo > "+id+")";
stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rst = stm.executeQuery();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Dados não localizados - método com parametros!\n" + ex +"\n" + ex.getMessage());
}
}
2 - Pra evitar repetição de código criei um método que "pega" do ResultSet e seta os campos da tela:
private void MostrarDados(){
try {
jtxfCodigo.setText(rst.getString("codigo"));
jtxtfNome.setText(rst.getString("nome"));
jtxtfCep.setText(rst.getString("cep"));
jComboBox1.setSelectedItem(rst.getString("uf"));
} catch (SQLException ex) {
}
}
3 - Nos botões Primeiro e Último, fiz o seguinte:
private void jbtnPrimeiroActionPerformed(java.awt.event.ActionEvent evt) {
try {
PreencherResultSet();
rst.first();
MostrarDados();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex.getMessage());
}
}
E:
private void jbtnUltimoActionPerformed(java.awt.event.ActionEvent evt) {
try {
PreencherResultSet();
rst.last();
MostrarDados();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex);
}
}
4 - Nos botões Anterior e Próximo, para evitar erros nos casos em que já estiver navegando pelo primeiro ou último registro criei métodos que recuperam o primeiro e último registro do banco. Ao clicar em um desses botões eu verifico se o valor do código do registro selecionado corresponde ao valor do primeiro ou último registro do banco, caso sejam iguais chamo a rotina de mostrar dados. Caso sejam diferentes chamo o método sobrescrito para preencher ResultSet:
private String CapturaIdMaximo(){
String lastId = null;
try{
String sql = "select * from cidade where codigo = (select max(codigo)as id from cidade)";
stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rst = stm.executeQuery();
rst.first();
lastId = rst.getString("codigo");
}catch(SQLException erro){
JOptionPane.showMessageDialog(null, "Dados não localizados 1!\n"+erro);
}
finally{
return lastId;
}
}
private String CapturaIdMinimo(){
String lastId = null;
try{
String sql = "select * from cidade where codigo = (select min(codigo)as id from cidade)";
stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rst = stm.executeQuery();
rst.first();
lastId = rst.getString("codigo");
}catch(SQLException erro){
JOptionPane.showMessageDialog(null, "Dados não localizados 1!\n"+erro);
}
finally{
return lastId;
}
}
Fazendo as verificações e preenchendo o ResultSet:
private void jbtnAnteriorActionPerformed(java.awt.event.ActionEvent evt) {
try {
int primeiroId = Integer.parseInt(CapturaIdMinimo());
id_selecionada = Integer.parseInt(jtxfCodigo.getText());
if(id_selecionada != primeiroId){
PreencherResultSet("voltar", id_selecionada);
rst.first();
}
MostrarDados();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex.getMessage());
}
}
private void jbtnProximoActionPerformed(java.awt.event.ActionEvent evt) {
try {
int ultimoId = Integer.parseInt(CapturaIdMaximo());
id_selecionada = Integer.parseInt(jtxfCodigo.getText());
if(id_selecionada != ultimoId){
PreencherResultSet("c", id_selecionada);
rst.first();
}
MostrarDados();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Dados não localizados2!\n" + ex);
}
}
Conforme disse anteriormente, com certeza existem formas melhores e mais práticas de resolver este problema. Mas como medida paliativa encontrei essa forma.
Espero que possa servir como idéia inicial para outros colegas que venham a ter a mesma dúvida que eu.