Блокировка в JavaFX во время ожидания результата диалога Swing - PullRequest
0 голосов
/ 02 сентября 2018

Фон

У меня есть приложение Swing . Я запускаю JavaFx , встроенный в приложение Swing. Я запускаю веб-браузер ( webview ) внутри приложения JavaFx . Я добавляю обработчик для получения функции веб-браузера confirm. Этот обработчик вызывается в потоке событий JavaFx . Обработчик является синхронным и возвращает boolean обратно в веб-представление .

Задача

Чтобы открыть диалоговое окно Swing для пользователя, мне нужно запустить поток событий Swing , но вернуться из обратного вызова JavaFx только после ответа на диалог.

Вот пример моего обратного вызова

engine.setConfirmHandler(()->{
   // in JavaFX context
   CountdownLatch latch = new CountdownLatch(1);

   SwingUtilities.invokeLater(()->{
      // in Swing context
      showModalDialog();
      latch.countDown();
   });

   // Wait for latch
   // HOW DO I BLOCK HERE AND STILL PROCESS EVENTS IN JAVAFX/SWING?
   return result;
});

Вопрос

Как я могу отложить возврат из обратного вызова до закрытия диалога, не блокируя события пользовательского интерфейса в контекстах JavaFX или Swing ?

1 Ответ

0 голосов
/ 02 сентября 2018

В JavaFX есть способ блокировки при обработке событий.

Java 8

Toolkit.getToolkit().enterNestedEventLoop(key)

Java 9

Platform.enterNestedEventLoop(key)

Другой поток может затем exitNestedEventLoop разблокировать и в качестве бонуса также может возвращать значение.

Java 8

Toolkit.getToolkit().exitNestedEventLoop(key, result)

Java 9

Platform.exitNestedEventLoop(key, result)

Однако при вызове exitNestedEventLoop из Swing необходимо переключиться обратно в контекст JavaFX.

Итак, вот рабочий пример ( Java 8 ).

engine.setConfirmHandler(()->{
   // in JavaFX context

   SwingUtilities.invokeLater(()->{
      // in Swing context
      boolean result = showModalDialog();
      Platform.runLater(()->{
          // back to JavaFX context
          Toolkit.getToolkit().exitNestedEventLoop(key, result)
      })
   });

   // Wait for result
   boolean result = Toolkit.getToolkit().enterNestedEventLoop(this)
   // still in JavaFX context
   return result;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...