JavaFX 8:如何向侦听器添加时间延迟?

ben*_*i26 3 javafx timedelay delay listener livesearch

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

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

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

非常感谢提前!

jew*_*sea 12

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

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

我没有测试这个,但它应该工作:-)

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

  • 你好,jewelsea,我的回复也延迟了:我最终使用了你的解决方案,如果工作完美,谢谢! (2认同)