【发布时间】: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