【问题标题】:Using a Document Listener to display search results in real time? [duplicate]使用 Document Listener 实时显示搜索结果? [复制]
【发布时间】:2017-06-05 19:15:48
【问题描述】:

我有一个显示在 JTable 中并存储在数据库中的“人员”列表。我非常希望用户在输入搜索区域时缩小该表中的结果范围。

例如,输入“S”会将显示的名称缩小为“Susan”、“Stephen”、“Steve”,一旦输入“Su”,这些名称就会缩小为“Susan”

我正在考虑使用 DocumentListener 方法 .removeUpdate(e).insertUpdate(e) 来调用搜索底层数据库并更新表视图的方法 - 但这似乎很浪费。

实际上,我将创建一个新的数据库连接和其他数据库对象,并在每次键入任何字符时刷新表。我不确定这是否只是糟糕的设计,还是会主动给我带来问题的东西?有没有更好的方法来解决这个问题?还是我应该坚持使用普通的搜索按钮?

【问题讨论】:

标签: java mysql swing


【解决方案1】:

我有一个显示在 JTable 中的“人员”列表

如果所有人都显示在 JTable 中,那么您可以使用 JTable 的filtering 功能来显示表中行的子集。

阅读 Sorting and Filtering 上的 Swing 教程部分,了解更多信息和工作示例。

【讨论】:

  • 啊当然——我什至不必查询数据库。太棒了,谢谢
  • @NickW,不要忘记点击复选标记“接受”答案,这样人们就知道问题已经解决了。
  • 完成 - 哦,我觉得教程即将打开我的程序,让我进入一个痛苦的世界 RE 我如何根据选定的行删除内容...... XD。不过谢谢
  • 它只会破坏 tablerowsorter 按 id 号排序的能力(这是我识别要删除的行的方式)。可能是另一个问题 - 但不是特别问题,因为我打算隐藏身份证号码。猜测我会说这是因为我使用 table.getSelectedRow() 来检索 ID 列值,然后用于删除数据库中的相关条目。不过有趣的东西
  • @NickW, it only breaks the tablerowsorter's ability to sort by id number - 在同一张桌子上进行排序/过滤工作。但是,一旦您开始使用过滤器/排序器,如果您需要访问 TableModel 中的行/列,则需要使用 convertRowIndexToModel(...)convertColumnIndexToModel(...) 方法。
【解决方案2】:

决定取决于您的应用程序和用户要求。有很多应用程序提供类似于您的自动完成功能。

在没有任何优化的情况下开始,看看它是如何执行的。然后您可以尝试不同的优化步骤,例如:

1) 在用户输入内容和搜索请求之间添加等待时间。例如,知道用户很可能会搜索比“S”更具体的文本,等到他们在一两秒内再输入几个字符。

2) 在不同的线程中运行搜索,然后从那里更新表。您可以在用户键入下一次搜索时取消之前的搜索线程。

3) 在用户键入时保持数据库连接打开,并在一定时间后关闭(例如 5 秒)。但不会太长。

【讨论】:

  • 可能不符合上述情况,但感谢您的回复
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多