3

我现在正在开发一个 JavaFX 8 应用程序,其中我有一个 tableView 和上面的一些 textFields,它们可以搜索/过滤 tableView 中的某些列。我在 textFields 中添加了一个侦听器,以便在检测到更改时自动触发过滤。我使用下面的代码来做到这一点。

textField_filterAddress.textProperty().addListener((observable, oldValue, newValue) -> {
            doSomething(); // in this case, filter table data and refresh tableView afterwards
        });

我现在的问题是:在触发过滤之前,集成某种时间延迟的最简单方法是什么?我想等待几毫秒,因为每次用户进行过滤时,它都会执行一个新的数据库查询,而且我认为这对于用户输入的每个字符都不是必需的。我宁愿等到他/她完成了他的输入。整个监听器中是否已经内置了某种类似的功能?还是我必须实施自己的解决方案?如果是这样,怎么做?我想到了某种并发解决方案,这样软件的其余部分就不会在等待期间冻结。但我想我会在这里问是否有更简单的解决方案,然后再考虑我自己的方式......

提前非常感谢!

4

2 回答 2

16

下面的代码将安排在最后一次文本字段更改后延迟 1 秒后执行某些操作。如果文本字段在该 1 秒窗口内发生更改,则忽略先前的更改,并计划在最近一次更改后 1 秒内使用新值完成某些操作。

PauseTransition pause = new PauseTransition(Duration.seconds(1));
textField.textProperty().addListener(
    (observable, oldValue, newValue) -> {
        pause.setOnFinished(event -> doSomething(newValue));
        pause.playFromStart();
    }
);

我没有对此进行测试,但它应该可以工作:-)

更复杂的解决方案可能是使用“健忘”的ReactFX 可挂起事件流。相关问题中讨论了基于 ReactFX 的解决方案:

于 2016-01-14T11:40:45.723 回答
0

有趣的问题,我相信其他人已经处理过。我第一次考虑这个问题,不知道这个建议有多实用,但这里是:

让您的文本字段侦听器向队列发送通知。然后,使用以您喜欢的时间间隔执行的 util.TimerTask 方法来处理队列,并使用它来构建新的过滤器(或不构建)。

上面的等待时间可能会有很大的变化,因此为了使其更加一致,发送带有时间戳的文本字段 ID 并让 Timer 更频繁地运行,并且仅在经过一定时间后才处理新过滤器.

有多种并发安全队列可用于存放数据。

于 2016-01-14T08:32:24.357 回答