Por que o ResultSet fecha sozinho?

Pessoal, tenho uma dúvida que tá me incomodando pra caramba. Eu criei um ComboBox que é alimentado por um ResultSet. Ao selecionar um item desse ComboBox, um evento é disparado, para que sejam retornados TODOS os dados do item selecionado (Ou seja: Se eu clicar por exemplo no nome do bairro, retorna o código, o nome, etc… tudo o que tiver numa row do ResultSet) para que eu crie um objeto a partir dessa row.

public String[] getDadosItemSelecionado(){
      try{         
         rs.absolute(this.getSelectedIndex() + 1);
         
                        String[] dados = new String[numColunas];
         for(int x = 1; x <= numColunas; x++){            
            dados[x - 1] = rs.getString(x);
         }         
         return dados;
      } catch(SQLException e){
         System.err.println("Erro processar dados da linha");
         e.printStackTrace();
      }
      return null;
   }

Beleza, na primeira vez que eu clico em um item, ele busca os dados certinho. Mas na segunda vez, ele dispara uma SQLException:

Erro processar dados da linha
java.sql.SQLException: ResultSet is closed
   at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(Unknown Source)
   at sun.jdbc.odbc.JdbcOdbcResultSet.absolute(Unknown Source)
   at germanobax.uteis.ComboDB.getDadosItemSelecionado(ComboDB.java:38)
   at prefeitura.gui.FrameCadastroLogradouro$ItemListenerCombo.itemStateChanged(FrameCadastroLogradouro.java:204)
   at javax.swing.JComboBox.fireItemStateChanged(Unknown Source)
   at javax.swing.JComboBox.selectedItemChanged(Unknown Source)
   at javax.swing.JComboBox.contentsChanged(Unknown Source)

... e por aí vai...

Eu resolvi isso fazendo o seguinte:

public void itemStateChanged(ItemEvent e){
         comboDB.setResultSet(bairroDB.getResultSet()); /*É uma saída. Podre, mas é uma saída.*/
         /*Aqui é onde o método que mostrei lá em cima é chamado*/
         Bairro b = new Bairro(comboDB.getDadosItemSelecionado()),
         ...

Não tem outra saída? Fazer isso em várias telas chega a ser absurdo de tão ridículo. E mais: o que é que faz com que o meu ResultSet seja fechado?

Ah, antes que eu esqueça: Ao criar o Statement para executar os select’s que geram os ResultSet’s do meu sistema:

statement = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Se puderem me ajudar com uma solução mais decente, ficarei grato.
Valeu!

PS.: Estou reinventando a roda porque estou em processo de aprendizado. Senão eu iria à procura de classes especializadas que já fazem esse tipo de coisa.

Não entendi muito o funcionamento do seu sistema pelo código que você postou… Se você postar a conectividade com o banco e a consulta que vc está fazendo talvez facilite…
Mas eu pessoalmente criaria um Objeto que conteria 2 atributos (valor e nome por exemplo) e popularia este objeto com a consulta do banco…
Em cima deste objeto criaria uma combo e salvaria na sessão por exemplo, para evitar ter que ficar montando essa combo várias vezes…
Se, dependendo do valor selecionado nesta combo, outra combo deverá ser montada, teriamos que executar outra conexão com o banco e efetuar novamente a consulta, reiniciando o ciclo…
É muito recomendado que as conexões com o banco sejam fechadas logo após a sua utilização…

Ajudei? não? heheeh
[] 's

Bah…que código maluco meu bruxo hehehe

Hummm…faz assim:

Monta um select e põe os valores que tu qué na ComboBox…dai tu pega o valor que o cara selecionou na ComboBox que tu montou e, logo, monta outro select utilizando no “where” o valor que o cara selecionou!
Este é o modo mais simples e robusto de faze =)

O ResultSet sempre vai fechar sozinho né cara… ou tu queria que os valores ficassem dísponiveis lá até a hora que tu resolvesse usá-los?!

Abraço, bruxo!

A idéia é fazer com que o ComboBox genérico, que seja utilizado para qualquer caso, e não para um específio, por isso ele tem que receber um ResultSet ao invés de ter uma consulta pré-determinada nele.

Ou seja, eu simplesmente instancio o comboBox, dou um resultSet pra ele e informo qual coluna do resultSet ele vai exibir. O resto ele faz sozinho.

Eu tava tentando fazer algo parecido com os componentes do Delphi, VB, etc, que fazem isso. Mas não tem galho, eu simplesmente enfiei todos os dados dentro de um Array e o resultSet que se exploda.

Mas até agora não entendi por que o resultSet fecha sozinho… porque eu gostaria muito de puder usar ele quando eu bem entender, como ocorre em outras linguagens de programação. Afinal, nem sempre é viável você percorrer todo um resultSet e armazenar os valores em Array’s para posterior recuperação.

E se o resultSet do java fornece métodos para inserção, alteração e exclusão de dados (como todas as implementações de resultset de n linguagens de programação), por que raios ele iria fechar?