Вы не должны обновлять пользовательский интерфейс из потока, отличного от потока приложения JavaFX.Поскольку Task.call
запускается в отдельном потоке, вы не должны запускать там код.Также связывание со свойством curser вместо вызова setDisable(false)
кажется плохой идеей, тем более что вы никогда не отменяете привязку свойства.
Используйте обработчик событий для onSucceeded
для обработки успешного завершения задачи.(onFailed
и onCanceled
доступны для различных способов завершения вашей задачи, чего не произойдет в фрагменте кода, который вы разместили.)
buttonName.setOnAction((event) -> {
buttonName.getScene().setCursor(Cursor.WAIT);
buttonName.setDisable(true);
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
try {
anotherFunction();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
};
task.setOnSucceeded(evt -> {
buttonName.getScene().setCursor(Cursor.DEFAULT);
buttonName.setDisable(true);
});
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
});
Чтобы отключить другие элементы управления в сцене, вывместо этого можно отключить / повторно включить корень сцены:
buttonName.getScene().getRoot().setDisable(newValue);
Чтобы предотвратить выделение серым цветом, JavaFX применяется к отключенным элементам управления (установка непрозрачности до 0,4), вы можете применить другую непрозрачность с более высоким приоритетом, например, установивнепрозрачность из кода
buttonName.setOpacity(1);
или путем применения стиля с использованием пользовательской таблицы стилей
style.css
*:disabled {
-fx-opacity: 1;
}
инициализация сцены
scene.getStylesheets().add("style.css");