【问题标题】:Using JComboBox as a search box使用 JComboBox 作为搜索框
【发布时间】:2012-12-22 12:40:28
【问题描述】:

我使用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); 总是给出一个空字符串。一旦我输入一个字母,组合框的文本字段就会变成空的(我不能输入一个有两个字母的单词)。如何解决这个问题?谢谢。

【问题讨论】:

  • removeAllItems 可能会清除编辑器(虽然没有挖掘)
  • 在添加所有项目并显示弹出窗口后,也许只是尝试在编辑器上重新设置文本? removeAllItems() 确实会清除文本
  • 在事件调度线程上执行数据库查询不是一个好主意,当然也不是在每次击键时。此外,您为什么可以访问该KeyEventJComboBox 的编辑器支持 DocumentListeners,这几乎总是更好的选择
  • @kleopatra 是的,它清除了编辑器。但是删除它并不能解决问题。
  • @GuillaumePolet 我也试过了。原因是,可编辑组合框不充当JTextFieldsr.setSelectedItem(null); 未选中且字段为空。

标签: java swing search jcombobox


【解决方案1】:

您出现问题的原因如下:

  1. sch 始终为空是因为您在调用String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText(); 之前调用了sr.removeAllItems();。这意味着在您获得所选内容之前,JComboBox 的内容会被清除(连同所选内容)。

    解决方案:在您获得所选项目后致电sr.removeAllItems();

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

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

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

【讨论】:

    【解决方案2】:

    使用ActionListener 而不是寻找按键。当组合框的选择被编辑时,它会在编辑完成时触发ActionEvent

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

    【讨论】:

      【解决方案3】:

      找到解决方案。此代码运行良好。

        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

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多