Запустить логику после показа окна - PullRequest
1 голос
/ 07 апреля 2019

У меня есть небольшая программа, которая вызывается другой программой, загружает / переименовывает некоторые файлы и впоследствии закрывается. Я хочу показать пользователю прогресс с помощью простого текста. Моя проблема в том, что логика кода запускается до того, как представление полностью отображается. Окно видно, но его содержимое (в данном случае образец текста) не отображается.

Я уже пробовал setOnShown () (как видно из моего примера) или setOnShowning (). Я также попытался не использовать файл fxml для макета. Но, похоже, ничего не работает.

public void start(Stage primaryStage) throws Exception {
        HBox root = new HBox();
        Text t = new Text();
        t.setText("sample Text");
        root.getChildren().add(t);
        Scene scene = new Scene(root, 300, 275);
        primaryStage.setTitle("FXML Welcome");
        primaryStage.setScene(scene);
        primaryStage.setOnShown(e -> {
            updaterLogic(); //do some work
        });
        primaryStage.show();

    }
    public static void main(String[] args) {
        launch(args);
    }
    public void updaterLogic(){
        try {
            Thread.sleep(10 * 1000);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Я хочу, чтобы представление было завершено до запуска фактической логики. Как мне это заархивировать?

1 Ответ

0 голосов
/ 07 апреля 2019

Чтобы выполнить что-либо после показа окна, вы можете:

  1. Прослушивание события WindowEvent.WINDOW_SHOWN.
    • См. Window.onShown и Window.addEventHandler
  2. Прослушайте свойство Window.showing и отреагируйте, когда оно изменится на true.
  3. Поставьте код после звонка на show().
    • Но не showAndWait(), поскольку этот метод не возвращается, пока окно не закрыто (и его нельзя вызывать на начальной стадии).

Однако, как это сделать, не ваша проблема (вы уже используете onShown). Ваша проблема вызвана тем, как вы выполняете «логику обновления». Внутри вашего updaterLogic() метода вы вызываете Thread.sleep (имитирующий работу). Поскольку обработчики событий выполняются в потоке приложений JavaFX , который вызывает блокировку указанного потока. Несмотря на то, что поток FX заблокирован, он не может делать ничего, связанного с GUI (например, разметка проходов, импульсы рендеринга, обработка пользовательских событий и т. Д.) - таким образом, замороженное окно без визуализации контента.

Переместите «логику обновления» в фоновый поток, чтобы поток FX мог свободно выполнять свою работу. Для получения общей информации о параллелизме в Java см. Урок: Параллелизм и пакет java.util.concurrent. Подробнее о JavaFX см. Параллелизм в JavaFX , пакет javafx.concurrent и Platform.runLater(Runnable).

Вот два золотых правила JavaFX:

  1. Вы не должны ни блокировать , ни выполнять длительную работу над Потоком приложений JavaFX .
  2. Вы должны всегда получать доступ и изменять график живой сцены в потоке приложений JavaFX .

    • Это задокументировано Node:

      Объекты Node могут создаваться и изменяться в любом потоке, если они еще не присоединены к сцене в отображаемом окне. Приложение должно присоединить узлы к такой сцене или изменить их в потоке приложений JavaFX.

      Примечание. Некоторые узлы, такие как WebView, должны быть созданы в потоке FX; это будет соответствующим образом задокументировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...