У меня есть приложение java fx со многими табличными представлениями. Как мы знаем в javafx tableview, есть привязка данных, которая работает в двух направлениях. Поэтому, когда мое приложение делает вычисления с моими данными из пользовательского интерфейса tableviws, оно замерзает, потому что мое приложение постоянно обновляет данные из табличных представлений (ObservableList). Я пытался использовать Platform.RunLater, но мне это не помогло. Есть идеи?UI зависание при выполнении некоторых вычислений
ответ
Platform.runLater
По существу задерживает ваш runnable - но он все же снова запускается на UI-потоке, поэтому блокирует каждый пользовательский ввод во время выполнения.
Решение очень простое, use a worker thread:
Task task = new Task<Void>() {
@Override public Void call() {
static final int max = 1000000;
for (int i=1; i<=max; i++) {
if (isCancelled()) {
break;
}
updateProgress(i, max);
}
return null;
}
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
Хотя рекомендуется использовать ExecutorService
класс, так как она позволяет более контролируемым поведением: http://java-buddy.blogspot.de/2012/06/example-of-using-executorservice.html
As i unders tand, ваш пример будет работать, если я хочу периодически обновлять свой пользовательский интерфейс, и количество этих обновлений будет ограничено. Но я хочу обновить свой интерфейс при выполнении моих вычислений. UPD: Спасибо! Это действительно работает! –
нет проблем - вы можете запустить свою задачу навсегда, если это требование, нет ограничений на время выполнения, это просто пример. Если вы натыкаетесь на исключения «Не на FX-приложении», решение также довольно просто: заверните вызов функции нарушения (_nothing else! _) В 'Platform.runLater' – specializt
' Platform.runLater (...) 'не обязательно задерживать выполняемое в любом наблюдаемом смысле; на самом деле, если ваше приложение хорошо структурировано, оно будет работать с помощью следующего кадра визуализации пользовательского интерфейса. Имя метода просто указывает, что вызов является асинхронным, поэтому выполнение кода будет продолжаться после вызова 'Platform.runLater (...)', но до того, как runnable, вероятно, закончит. –
- 1. Javascript - манипулирование DOM при выполнении вычислений
- 2. Android: всплывающее предупреждение при выполнении вычислений
- 3. Php получить фактические результаты при выполнении вычислений
- 4. Сохранение анимации GIF при выполнении вычислений
- 5. Сохранение «бесполезных» 0s при выполнении вычислений
- 6. UI зависание при изменении ObservableCollection/CollectionViewSource
- 7. PHP, обрабатывающий отображение некоторых вычислений
- 8. блокировка программы при выполнении некоторых задач
- 9. За исключением некоторых оценок при выполнении Рекомендатора
- 10. Tkinter Threading вызывает зависание UI
- 11. Почему всплывающее окно Silverlight висит при выполнении вычислений?
- 12. Что происходит именно при выполнении нерегулярных вычислений в C#?
- 13. Как тензорный поток обрабатывает графа вычислений при выполнении sess.run?
- 14. Как игнорировать значения в 2D-массиве при выполнении вычислений
- 15. Странная ошибка в Python3 при выполнении вычислений большой Int
- 16. Как отобразить экран загрузки при выполнении тяжелых вычислений в Android?
- 17. Лучший способ помочь производительности плагинов валют при выполнении вычислений
- 18. MATLAB откладывает вызовы disp при выполнении сложных вычислений. Почему это?
- 19. Выполнение некоторых вычислений в mysql, номера при использовании GROUP BY
- 20. Кендо UI: ошибка при выполнении контроллера
- 21. Silverlight TimePicker/ChildWindow/DataTemplate вызывает зависание UI
- 22. Сумма полей ввода после некоторых календарных вычислений
- 23. UI получает зависание при прокрутке UIPickerView, UITableView ios8, ios9
- 24. jQuery ui кнопки непоследовательное зависание состояние
- 25. «зависание» при нажатии
- 26. Как обновить часть ng-view после некоторых асинхронных вычислений
- 27. MongoDB не использует индексы для некоторых полей при выполнении отличных
- 28. Объединить ячейки строки по уникальным клавишам при выполнении некоторых условий
- 29. Как заменить определенный класс при выполнении некоторых тестов JUnit?
- 30. Выполнение некоторых действий при неудачном выполнении теста Spock
использование AsyncTask или нить .. –
Попробуйте запустите свои обновления в отдельном потоке: http://stackoverflow.com/questions/28453344/how-to-update-tableview-items-outside-javafx-thread – Tomek
Это также может помочь: http://stackoverflow.com/questions/11690683/javafx-update-ui-from-another-thread –