【问题标题】:JavaFX 8: how to add a timedelay to a listener?JavaFX 8:如何向侦听器添加时间延迟?
【发布时间】:2016-04-19 10:49:57
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

  • 您预计总共有多少数据?如果不是太多,最初加载所有内容并使用FilteredList 可能是合理的。
  • sillyfly,不幸的是,我最初不允许加载所有内容,因为这是一个有一定限制的大学项目

标签: javafx listener delay timedelay livesearch


【解决方案1】:

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

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

上面的等待时间可能会有很大的变化,所以为了使其更加一致,发送带有时间戳的文本字段 ID 并让 Timer 更频繁地运行,并且仅在达到一定数量的情况下才处理新过滤器时间已经过去了。

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

【讨论】:

    【解决方案2】:

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

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

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

    更复杂的解决方案可能是使用“健忘”ReactFX suspendable event stream。相关问题中讨论了基于 ReactFX 的解决方案:

    【讨论】:

    • 嗨,jewelsea,我的回复也延迟了:D 我最终使用了您的解决方案,如果效果很好,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多