使用JComboBox作为搜索框

时间:2013-01-08 15:46:08

标签: java swing search 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

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

3 个答案:

答案 0 :(得分:1)

您遇到问题的原因如下:

  1. sch始终为空,因为您在致电sr.removeAllItems();之前呼叫String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText();。这意味着在获得所选内容之前,JComboBox的内容将被清除(连同选择)。

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

  2. 组合框变空,因为您在重新填充后会在结束时调用sr.setSelectedItem(null);

    解决方案:如果您想要输入的文字,请sr.getEditor().setItem(scr);

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

答案 1 :(得分:1)

使用ActionListener而非寻找按键。编辑组合框的选择时,编辑完成后将激活ActionEvent

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

答案 2 :(得分:0)

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

  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