Malta reparem no seguinte código:
Tenho em uma classe:
private void jTextFieldNomeKeyTyped(java.awt.event.KeyEvent evt) {
if(evt.getKeyChar() != KeyEvent.VK_BACK_SPACE )
{
String TextojTextFieldNome = jTextFieldNome.getText() + evt.getKeyChar();
try
{
dal.carregaDadosJList(TextojTextFieldNome, jList1);
}
catch (SQLException ex)
{
Logger.getLogger(EcraInicial.class.getName()).log(Level.SEVERE, null, ex);
}
dal.apresentaAutoComplete(jList1, jScrollPane, TextojTextFieldNome);
}
}
private void jTextFieldNomeKeyPressed(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
if(evt.getKeyCode() == KeyEvent.VK_BACK_SPACE )
{
if(evt.getKeyCode() == 10)
{
dal.ListaLinhaSeleccionada(jList1, jTextFieldNome);
}
String a = jTextFieldNome.getText();
String TextojTextFieldNomeSemUltimaString = a.substring(0, a.length() - 1);
try
{
dal.carregaDadosJList(TextojTextFieldNomeSemUltimaString, jList1);
}
catch (SQLException ex)
{
Logger.getLogger(EcraInicial.class.getName()).log(Level.SEVERE, null, ex);
}
dal.apresentaAutoComplete(jList1, jScrollPane, TextojTextFieldNomeSemUltimaString);
}
E em outra:
public void carregaDadosJList(String like, JList jList) throws SQLException //tem de estar na mesma classe da ComboBox
{
jList.removeAll();
DefaultListModel lista = new DefaultListModel();
String str1 = "Select COD_ENTIDADE, NOME_ENTIDADE, VALOR_DESCONTO from ENTIDADE_DESCONTO where NOME_ENTIDADE like '"+like+"%'";
PreparedStatement stmt = this.conexao.prepareStatement(str1);
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
Entidade_Desconto_Logica EDL = new Entidade_Desconto_Logica();
lista.addElement(rs.getString("NOME_ENTIDADE"));
EDL.setNOME_ENTIDADE(rs.getString("COD_ENTIDADE"));
EDL.setNOME_ENTIDADE(rs.getString("NOME_ENTIDADE"));
EDL.setVALOR_DESCONTO(Long.valueOf(rs.getString("VALOR_DESCONTO")));
}
jList.setModel(lista);
numeroLinhasDaLista = lista.size();
}
public void apresentaAutoComplete(JList jList1,JScrollPane jScrollPane1, String textoJTextField)
{
System.out.println("1");
System.out.println("numeroLinhasDaLista "+numeroLinhasDaLista);
jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jList1.setSelectedIndex(0);
if(numeroLinhasDaLista <= 10)
{
jList1.setVisibleRowCount(numeroLinhasDaLista);
}
else
{
jList1.setVisibleRowCount(10);
}
if (numeroLinhasDaLista > 0)
{
jScrollPane1.setVisible(true);
}
else
{
jScrollPane1.setVisible(false);
}
System.out.println(textoJTextField);
if(textoJTextField.equals(""))
{
jScrollPane1.setVisible(false);
}
System.out.println("2");
}
O que isto faz é ir a base de dados fazer a pesquisa e retornar a informação numa jlist que esta dentro de um jPainel, isto sempre k uma letra é inserida num jTextField.
Agora é o seguinte, ao inserir uma letra a pesquisa funciona perfeitamente e a listagem dos dados também, o problema é quando um letra é removida, a pesquisa continua a ser bem feita, pois eu comprovo isso basta ver o “numeroLinhasDaLista = lista.size();”, que retorna sempre o valor certo, o problema aqui é que o número de linhas da jlist não está correto, não são mostradas todas as linhas apesar da informação estar na jList.
Exemplo pesquiso a string BB e ele retorna o campo da tabela desejado começado po “BB”, e retorna 7 linhas na JList e lista as 7, depois retiro um B fazendo um Backspace e ele faz a pesquisa da string “B” e retorna 9 linhas mas apenas 7 são mostradas…