【问题标题】:Live search (or autocomplete) through database from Swing通过来自 Swing 的数据库进行实时搜索(或自动完成)
【发布时间】:2014-10-31 18:54:19
【问题描述】:

我正在尝试进行“谷歌”搜索。用户输入一些东西——程序进入数据库并返回建议列表。我正在使用 AutoComplete 包,但不确定是否以正确的方式,因为我没有得到组合下方的建议列表,所以我可以查看并滚动浏览他,但它会自动从列表中选择一个建议并将他放到场。此外,例如,如果首先用户使用字母“I..”开始搜索,则自动完成功能会完成这项工作(如上所述),然后如果用户想要输入其他文章的名称,例如“A..”,则组合只会刷新本身与 previos 结果,所以搜索真的变得不可用。

class SuggestArticleNameActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                @Override
                protected Void doInBackground() throws Exception {
                    Vector<String> suggestions = new Vector<>();
                    try {
                        try (Connection conn = DriverManager.getConnection(JDBC_URL, LOGIN, PASSWORD)) {
                            PreparedStatement pstmt = conn.prepareStatement("SELECT name FROM Article WHERE Article.name LIKE ?");
                            String typed = comboBoxSearchArticle.getEditor().getItem().toString();
                                pstmt.setString(1, "%"+typed+"%");
                                ResultSet result = pstmt.executeQuery();
                                while (result.next()) suggestions.add(result.getString("name"));
                                            Collections.sort(suggestions);
                        }
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                    comboBoxSearchArticle.setModel(new DefaultComboBoxModel<String>(suggestions.toArray(new String[suggestions.size()])));
                    return null;
                }

除了 AutoComplete 还有其他问题:我是否使用了正确的 Listener 并且这段代码是线程安全的?如果有更有效的方法,请告诉我。

【问题讨论】:

  • 您是否尝试过使用虚假建议列表(不与数据库交互)实现自动完成?
  • @Dmytro 是的,它工作得很好。我用更多描述编辑了我的帖子。

标签: java swing search jdbc autocomplete


【解决方案1】:

最好实现ItemListener

class SuggestArticleNameActionListener implements ItemListener{
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          Object item = event.getItem();
          // implement your logic here
       }
    }       
}

【讨论】:

  • 您能解释一下原因吗?在我看来,逻辑是一样的
  • ActionListener 监听的事件有很多。例如,它侦听先前的值取消选择事件。这就是为什么它会刷新之前的结果。
  • 那么为性能目的实现 ItemListener 会更好吗?我实现了监听器,但问题仍然存在。
  • 我不确定。您说使用虚假数据可以正常工作。那么问题可能出在您的 sql 查询中?
  • 我正在使用您在上面看到的 sql。现在我认为自动完成 api 是问题所在。因为它不允许空组合,而且它不会在组合字段下方显示建议,而是选择其中一个并完成用户的输入。如果这就是它的工作方式,那么如何修改 AutoComplete API 以响应我的目的?
猜你喜欢
  • 2017-09-22
  • 1970-01-01
  • 2010-12-16
  • 2018-12-31
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多