В 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;
});