Java 通过Swing中的数据库进行实时搜索(或自动完成)

Java 通过Swing中的数据库进行实时搜索(或自动完成),java,swing,search,jdbc,autocomplete,Java,Swing,Search,Jdbc,Autocomplete,我正在尝试做“谷歌”搜索。用户键入某物-programm转到DB并返回建议列表。我使用的是AutoComplete软件包,但不确定是否正确,因为我没有得到combo下面的建议列表,因此我可以查看并滚动浏览他,但它会自动从列表中选择一个建议并将他放到字段中。此外,例如,如果用户首先用字母“I…”开始搜索,则自动完成完成任务(如上所述),然后如果用户希望键入其他文章的名称,如“A…”,则组合仅使用previos结果刷新自身,因此搜索实际上变得不可用 class SuggestArticleNameA

我正在尝试做“谷歌”搜索。用户键入某物-programm转到DB并返回建议列表。我使用的是AutoComplete软件包,但不确定是否正确,因为我没有得到combo下面的建议列表,因此我可以查看并滚动浏览他,但它会自动从列表中选择一个建议并将他放到字段中。此外,例如,如果用户首先用字母“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;
                }
类SuggestArticleNameActionListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
SwingWorker worker=新SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
向量建议=新向量();
试一试{
try(Connection conn=DriverManager.getConnection(JDBC_URL、登录名、密码)){
PreparedStatement pstmt=conn.prepareStatement(“从文章中选择名称,其中Article.name LIKE?”);
字符串类型=comboBoxSearchArticle.getEditor().getItem().toString();
pstmt.setString(1,“%”+类型化+“%”);
ResultSet result=pstmt.executeQuery();
while(result.next())suggestions.add(result.getString(“name”);
收集、分类(建议);
}
}catch(SQLException-ex){
例如printStackTrace();
}
comboBoxSearchArticle.setModel(新的DefaultComboxModel(suggestions.toArray(新字符串[suggestions.size()]));
返回null;
}

除了自动完成之外,还有其他问题:我是否使用了正确的侦听器?此代码是否线程安全?如果有更有效的方法,请告诉我。

最好实现ItemListener

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

您是否尝试过使用假建议列表(不与数据库交互)实现自动完成?@Dmytro是的,它工作得很好。我编辑了我的帖子,并做了更多的描述。你能解释一下原因吗?从我的观点来看,逻辑是一样的。ActionListener侦听很多事件。例如,它侦听上一个值取消选择事件。这就是为什么它会刷新上一个结果。因此,最好实现ItemListener For Performancemance的目的?我实现了listener,但问题仍然存在。我不确定。你说使用假数据可以很好地工作。因此,可能问题出在你的sql查询中?我使用的是你在上面看到的sql。现在我认为问题出在autocomplete api。因为它不允许空组合,也不允许显示s在组合框字段下方的提示,它选择其中一个并完成用户的输入。如果这是它的工作方式,那么如何修改自动完成API以响应我的目的?