У меня есть TextArea
, в котором пользователь моего приложения может писать вещи. A ChangeListener
также прослушивает StringProperty
«текст» этого TextArea
. Всякий раз, когда изменяется текстовое содержимое, ChangeListener.changed()
, среди прочего, устанавливает "грязный" BooleanProperty
в true
для центрального объекта приложения. Где «грязный» имеет смысл «документ нуждается в сохранении».
Но я только что реализовал в своем приложении кое-что, когда каждый раз, когда «грязный» Property
устанавливается на true
, запускается автоматическое сохранение файла-на-диске, так что пользователю не нужно беспокоиться о ручном сохранении файлов. Примечание: акт сохранения также устанавливает dirty
обратно на * 1013. * Конечно.
Одна из проблем заключается в том, что это замедляет ввод TextArea
(в частности, поскольку это сохранение происходит на Форекс нить). Поэтому каждый новый добавленный или удаленный символ запускает действие сохранения.
Я хочу найти решение, в котором за каждым действием по изменению текста всегда следует сохранение не более, например, в течение 1 секунды, но где сохранение никогда не происходит более одного раза в течение этой 1 секунды ... очевидно, в потоке без FX.
Это не первый раз, когда я сталкивался с такой ситуацией, и в прошлом я возился с различными очереди таймеров и тд. Но трудно найти решение, когда оба критерия удовлетворены, и мне просто интересно, есть ли известный метод для решения этой проблемы ... даже, может быть, что-то из какой-то библиотеки?
Вот MRE / MCVE :
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
BooleanProperty dirty;
void setDirty(Boolean value) {
dirtyProperty().set(value);
if( value ){
System.out.println( "serialise to file again...");
// successful saving also means we become clean again:
dirtyProperty().set( false );
}
}
Boolean getDirty() { return dirtyProperty().get(); }
BooleanProperty dirtyProperty() {
if ( dirty == null) dirty = new SimpleBooleanProperty(this, "dirty");
return dirty;
}
@Override
public void start(Stage stage) throws Exception {
Scene scene = new Scene(new Group());
Group sceneRoot = (Group)scene.getRoot();
TextArea textArea = new TextArea();
textArea.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observableValue, String s, String t1) {
setDirty( true );
}
});
sceneRoot.getChildren().add( textArea );
stage.setMinWidth( 600 );
stage.setMinHeight( 400 );
stage.setScene(scene);
stage.show();
}
}
Каждое нажатие клавиши вызывает сохранение ...