Ваш метод readFile
создает Task
, передает его Thread
, запускает Thread
и возвращает.Затем вы пытаетесь немедленно распечатать значение text
.Нет гарантии, что ваш Task
будет завершен к тому времени, когда вы позвоните println(text)
.На самом деле, очень вероятно, что ваш Task
еще не завершен.Но это не единственная проблема.
Вызов readFile
и println
выполняются в одном потоке - в данном случае Поток приложения JavaFX .Проблема здесь в том, что EventHandler
, который вы передаете setOnSucceeded
, также будет вызываться в потоке FX.Это достигается внутренним способом с помощью вызова Platform.runLater
, который планирует действие с потоком FX для запуска в будущем .Это не может произойти, пока поток FX выполняет openMenuItemClick
и должен ждать, пока метод не вернется.
Все это означает, что setCurrentText
никогда не будет работать до тех пор, пока не будет вызван println
.Но во второй раз, когда вызывается openMenuItemClick
, text
будет установлено 1 .Так что то, что вы видите во второй раз, на самом деле является результатом первого Task
.
Если вы хотите что-то сделать с text
после завершения Task
, то вы должны сделать это внутри onSucceeded
или onFailed
обработчик.Или вы можете сделать text
a StringProperty
и наблюдать за изменениями.
1.Технически, может быть установлено .До сих пор нет никаких гарантий, что Task
завершится к тому времени.