使用JComboBox作为搜索框

我使用JComboBox从sql数据库中搜索查询。 这是我的代码。

 private void srKeyTyped(java.awt.event.KeyEvent evt){ sr.removeAllItems(); String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText(); String schh = "SELECT * FROM tbl WHERE name LIKE '" + sch + "%';"; search = conn.getQuery(schh); try { while (search.next()) { String item = search.getString("name"); sr.addItem(item); } } catch (SQLException ex) { Logger.getLogger(dataprocess.class.getName()).log(Level.SEVERE, null, ex); } sr.setSelectedItem(null); sr.setPopupVisible(true); System.out.println(sch); } 

sr = JComboBox

但是当我在combobox中键入一个字母时,它会添加数据库中的所有项目。 我开始知道System.out.println(sch); 总是给出一个空字符串。 只要我输入一个字母,combobox的文本字段就会变空(我不能输入带有两个字母的单词)。 如何解决这个问题? 谢谢。

您遇到问题的原因如下:

  1. sch总是空的是因为你正在调用sr.removeAllItems(); 在调用String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText();之前String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText(); 。 这意味着在获得所选内容之前,将清除JComboBox的内容(以及选择)。

    解决方案:调用sr.removeAllItems(); 在您获得所选项目之后。

  2. combobox变为空,因为您调用sr.setSelectedItem(null); 在你重新填充它之后的最后。

    解决方案:如果要输入文本,则输入sr.getEditor().setItem(scr);

只有想法,但尝试将方法的内容包含在if statement并检查是否按下了Enter key 。 这样,方法内容将仅在输入所需字符串后执行,而不是每次按下键时执行。

使用ActionListener而不是寻找按键。 编辑combobox的选择时,它将在编辑完成后触发ActionEvent

当你使这个部分工作时,你应该将这个逻辑移到另一个线程并在它返回时填充combobox的项目。 否则,您的UI将在SQL查询发生时挂起。

得到了解决方案。 这段代码工作正常。

  private void srKeyTyped(java.awt.event.KeyEvent evt){ String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText(); String schh = "SELECT * FROM tbl WHERE name LIKE '" + sch + "%';"; search = conn.getQuery(schh); sr.removeAllItems(); try { while (search.next()) { String item = search.getString("name"); sr.addItem(item); } } catch (SQLException ex) { Logger.getLogger(dataprocess.class.getName()).log(Level.SEVERE, null, ex); } System.out.println(sch); sr.setSelectedItem(null); sr.setPopupVisible(true); ((JTextField)sr.getEditor().getEditorComponent()).setText(sch); } 

感谢Skepi,Kleopatra,Guillaume Polet