Я пытаюсь выучить kotlin и у меня проблема с темой TornadoFX.
В JavaFX я мог бы обновить наблюдаемые Свойства в другом потоке, и Обновления будут происходить в представлении без триггера, используя «Platform.runLater ()»
ОБНОВЛЕНИЕ :
Все, что я предположил о безопасности потоков в JFX, неверно!
Обновляйте только элементы пользовательского интерфейса или свойства, связанные с потоком пользовательского интерфейса, с помощью Platform.runLater (), Tasks или Animationtimer, никогда не извнебез Platform.runLater ().
Хотя вам следует осторожно использовать Platform.runLater (), поскольку у вас мало контроля над тем, что будет добавлено в поток пользовательского интерфейса, и это может вызвать некоторые раздражения.
Ниже этой точки приведены мои неправильные представления :
Вот что прекрасно работает в JavaFX работает, но также неверно
@Fxml
ProgressBar progress;
@Fxml
public void initialize(){
DoubleProperty prop = new SimpleDoubleProperty(0);
progress.progressProperty().bind(prop);
ExecutorService ex = Executors.newSingleThreadExector();
ex.execute(()->{
while(true){
Thread.sleep(2000);
prop.set(prop.get()+0.1);
}
}
}
По сути тот же код, но в Kotlin. не работает и создает исключение:
Не в потоке приложения FX;currentThread = Thread-3 TornadoFX
class test : View() {
override val root: BorderPane by fxml("/views/primary.fxml")
val counter = SimpleDoubleProperty()
val progress: ProgressBar by fxid()
init {
thread{
while(true){
Thread.sleep(2000)
counter.value += 0.1
}
}
progress.bind(counter)
}
}
Я ожидал, что они будут работать одинаково. Я мог бы исправить это с помощью «Platform.runLater (() -> ...)», но я не хочу ставить все в очередь в потоке пользовательского интерфейса, когда он уже наблюдает за свойствами. Я думал, что это было единственной целью возможности связать что-то с элементом пользовательского интерфейса.
Я неправильно использую свойства и привязки или это TornadoFX проблема ?