Счетчик времени в Ваадине - PullRequest
0 голосов
/ 04 октября 2019

Я хотел бы реализовать счетчик, который отображает время работы. Вариант использования должен выглядеть следующим образом: одним нажатием кнопки определяется время запуска. В текстовом поле должно отображаться увеличивающееся время выполнения. Итак, через одну секунду 1, через две секунды 2 и так далее. Когда я нажимаю другую кнопку, счетчик времени останавливается, и текущее количество секунд замирает.

long startTime = System.currentTimeMillis();
long elapsedTime = System.currentTimeMillis() - startTime;
String elapsedSeconds = Long.toString(elapsedTime / 1000);
this.textField.setValue(elapsedSeconds);

Как реализовать ту же секунду, в текстовом поле будет показано соответствующее количество секунд. Нужно ли обновлять текстовое поле каждую секунду? Если это так, как мне это сделать?

Редактировать:

@Push
public class View {

    private final UI ui = this.getUI();
    private final long startTime;
    public View(final long startTime) {
        super();
        this.initUI();
        this.startTime = startTime;
        final Timer timer = new Timer();
        timer.schedule(new LiveTime(), 0, 1000);
        }

    private class LiveTime extends TimerTask {

        @Override
        public void run() {
            final long elapsedTime = System.currentTimeMillis() - View.this.startTime;
            final String elapsedSeconds = Long.toString(elapsedTime / 1000);
            View.this.ui.access(() -> View.this.textField.setValue(elapsedSeconds));
        }
    }

1 Ответ

2 голосов
/ 04 октября 2019

Вам нужно три вещи.

1) Задача или поток, который выполняет обновление.

Вот один пример того, как выполнить задачу: https://www.quora.com/How-do-I-create-a-thread-which-runs-every-one-minute-in-Java. В этом примере используется 10-минутный интервал, но вы можете изменитьэто до 1 секунды.

2) ui.access()

Если вы обновляете интерфейс через второй поток, вам нужно обновить его в вызове ui.access(), чтобы избежать повреждения данных или взаимоблокировок.

ui.access(() -> textField.setValue(elapsedSeconds));

Вы можете прочитать больше здесь: https://vaadin.com/docs/v14/flow/advanced/tutorial-push-access.html

3) Вам необходимо добавить @Push к вашему виду.

Vaadin по умолчанию является фреймворком, который запускается при каждом обновлении. при взаимодействии с браузером, который выполняет обход сервера и затем отправляет инструкции обратно в браузер, сообщая, как должен обновляться пользовательский интерфейс. В отдельном потоке запрос на обновление не поступает из браузера. но сервер, поэтому нет открытого запроса браузера для ответа. Поэтому ни одно из обновлений пользовательского интерфейса не будет отображаться в браузере до того, как пользователь нажмет на что-либо. Когда вы добавляете аннотацию @Push к вашему представлению, он указывает браузеру немедленно открыть запрос к серверу, который остается открытым, пока в браузере не появятся новые данные для отображения. В тот момент, когда данные поступают, они передаются в браузер.

Подробнее здесь: https://vaadin.com/docs/v14/flow/advanced/tutorial-push-configuration.html

...