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.