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



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

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

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

提前非常感谢!

下面的代码将安排在上次文本字段更改后的 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的解决方案在相关问题中进行了讨论:

  • 在对属性更改做出反应之前等待 JavaFX 8

PauseTransition 解决方案可以变得更加通用。

public abstract class DelayedListener<T> implements ChangeListener<T> {
    private final PauseTransition pause = new PauseTransition(javafx.util.Duration.seconds(1));
    private T ov, nv;
    public DelayedListener() {
        pause.setOnFinished(event -> {
            if (!Objects.equals(nv, ov)) {
                onChanged(nv);
                ov = nv;
            }
        });
    }
    @Override
    public void changed(@NotNull ObservableValue<? extends T> observable, T oldValue, T newValue) {
        nv = newValue;
        pause.playFromStart();
    }
    public abstract void onChanged(T value);
}

然后将其与以下任何属性一起使用(我通常只需要 newValue):

textField.textProperty().addListener(new DelayedListener<>() {
        @Override
        public void onChanged(String value) {
            System.out.println("Changed to " + value);
        }
    });

相关内容

  • 没有找到相关文章

最新更新