Только последнее обновление messageProperty в Задаче получено слушателем изменения связанного свойства - PullRequest
0 голосов
/ 14 апреля 2020

В моем приложении JavaFX-11 f xml у меня есть простая тестовая задача:

public class TestTask extends Task<Void> {
    @Override
    protected Void call() throws Exception {
         updateMessage("TestTask message before sleep 1");
        Thread.sleep(1000);
         updateMessage("TestTask message after  sleep 1");
        Thread.sleep(1000);
         updateMessage("TestTask message after sleep 2");
        Thread.sleep(1000);
         updateMessage("TestTask message after sleep 3");
        return null;
    }
}

В классе контроллера f xml я связал свойство со свойством сообщения Задача, и прослушиватель изменений, который я хочу использовать для записи сообщений в окне журнала:

TestTask testTask = new TestTask();
SimpleStringProperty taskMessage = new SimpleStringProperty();
taskMessage.bind(testTask.messageProperty());
taskMessage.addListener(cl -> {
   System.out.println("taskMessage change listener invoked, new value = " + taskMessage.getValue());
   msgList.add(taskMessage.getValue());
});

Я запускаю поток следующим образом:

Thread computationThread = new Thread(testTask);
computationThread.setDaemon(true);
computationThread.start();

На консоли отображаются следующие сообщения:

taskMessage change listener invoked, new value = 
taskMessage change listener invoked, new value = TestTask message after sleep 3

Я знаю, что «промежуточные значения сообщений могут объединяться для экономии на уведомлениях о событиях», но здесь мы говорим только о 4 сообщениях, разделенных 1 секундой. Они вряд ли могут затопить очередь событий, поэтому я не понимаю, почему связанное свойство обновляется только дважды: один раз с пустым сообщением и второй раз с последним сообщением.

1 Ответ

0 голосов
/ 17 апреля 2020

Использование ChangeListener является правильным способом сделать это. Когда я начал писать лямбда-выражение, IDE предложила список подходящих слушателей, и я случайно принял предложение InvalidationListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...