Веб-сайт JavaFX загружается асинхронно на реализацию. Любой слушатель состояния состояния loadworker получает обратный вызов в потоке JavaFX. Этот поток также запускает ваш пользовательский интерфейс, поэтому вы никогда не должны блокировать поток JavaFX. В системах на основе событий, таких как JavaFX, если вы хотите сделать тяжелую работу, вы сделаете это в своем потоке. Никогда, никогда не блокируйте поток JavaFX.
Причина, по которой я отвечаю, состоит в том, что у меня на самом деле есть аналогичная, но другая ситуация, в которой я нуждаюсь в синхронности нагрузки do. Моя первая идея заключалась в том, чтобы обернуть загрузку в моем собственном потоке и сделать этот блок, но операцию загрузки нужно вызывать из потока JavaFX. Тем не менее, я выяснил путь вокруг этого препятствия:
Сначала я начинаю новую тему, в которой я объявляю семафор (с разрешениями 0), откуда я запускаю Platform.runLater (...), который инициирует движок, добавляет слушателя к stateproperty и загружает URL-адрес, а затем пытается приобрести семафор. Это блокирует, поскольку семафор не имеет разрешений. В обратном вызове слушателя я запускаю еще один новый поток, в котором выполняю тяжелую работу, и оттуда я установил некоторую глобальную переменную данных, после чего я освобожу семафор. Это завершает мой последний новый поток, а затем информирует прежний новый поток, что данные загружаются, чтобы он продолжался. Это никогда не блокирует поток JavaFX.
При обертывании этой функции вы можете эмулировать операцию синхронной загрузки, но при ее использовании вы должны быть осторожны: вызовите функцию только из потока JavaFX. Однако это имеет смысл, потому что вы никогда не должны называть синхронную (ака блокирующую) нагрузку на поток JavaFX.
Спасибо за подсказку, Том! Я использую SWT BusyIndicator вместо модального диалога. –
В дополнение к индикатору занятости я решил собрать мои последующие команды браузера в очереди, а не сразу их выполнить. По завершении загрузки эта очередь будет обработана. Также см. Этот родственный вопрос: http://stackoverflow.com/questions/33971137/how-to-wait-for-webengine-browser-initialization-in-javafx-application/33981584#33981584 – Stefan