有没有办法继续监听属性更改几秒钟,然后触发事件(调用方法)?
例如,当用户在文本字段中输入数据时:
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) {
//before calling a method to do something.. wait for a few seconds ...
}
});
Run Code Online (Sandbox Code Playgroud)
一个场景是根据字符串值触发一个动作。例如,点击“M”进行移动,或点击“MA”进行掩码。在采取行动之前,我想“继续聆听”2 秒钟。
我正在开发一个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)
我现在的问题是:在过滤被触发之前,什么是最简单的集成某种时间延迟的方法?我想等几毫秒,因为每次用户过滤它时都在执行一个新的数据库查询,我认为这对于用户输入的每个字符都不是必需的.我宁愿等到他/她完成了他的输入.是否有某种类似的功能已经内置到整个听众的事情中?或者我必须实施自己的解决方案?如果是这样,怎么样?我考虑过某种并发解决方案,因此其他软件在等待期间不会冻结.但我以为我会问这里是否有一个更简单的解决方案,然后再考虑我自己的方式......
非常感谢提前!
我有一个简单的应用程序,它在后台更新数据,当它更新时,它会禁用所有其他按钮并启用 TextArea 来显示进度。
脚步:
禁用 mainUI 中的所有其他按钮(按钮名称:plotButton)
启用显示更新已开始的 TextArea(TextArea 名称:infoLogTextArea)
然后只启动更新方法(update() 抛出异常)。
这是代码:
@FXML
public void handleUpdateButton() {
infoLogTextArea.setVisible(true);
infoLogTextArea.appendText("Please wait while downloading data from internet.....\n");
plotButton.setDisable(true);
updateButton.setDisable(true);
if(c!=null) {
Runnable task = new Runnable() {
@Override
public void run() {
// Thread.sleep(10000); -> sleep for 10secs
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
c.updateData();
infoLogTextArea.appendText(c.getErrorLog().toString());
plotLabel.setText(c.getCityData().size()+" cities found and updated from internet");
infoLogTextArea.appendText("Successfully updated the data from Internet\n");
}catch (IOException e) {
infoLogTextArea.setText("Couldnot update the data …Run Code Online (Sandbox Code Playgroud)