Я работаю над приложением Swing, но некоторые части этого приложения начинают использовать JavaFX. Теперь я хотел бы использовать JavaFX FileChooser, потому что он показывает диалог, специфичный для операционной системы (гораздо удобнее в использовании).
Проблема в модальности. Для других диалогов существует несколько подходов для решения проблем модальности с JavaFX в Swing (например, оборачивание содержимого диалога в фрейм Swing с использованием другого JFXPanel
, установка alwaysOnTop
сцены в true
, ...). И то, и другое невозможно с FileChooser.
В настоящее время я использую этот подход, который является почти рабочим решением (осторожно: это только черновик, следует добавить CountDownLatch
и использование try {} finally {}
):
JDialog dialog;
SwingUtilities.invokeLater({ =>
dialog = new JDialog(thisView.getCanvas().getRootPane() as Frame, "", true);
dialog.setUndecorated(true);
dialog.setVisible(true);
});
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Load Composition From File");
fileChooser.showOpenDialog(null);
dialog.setVisible(false);
Идея состоит в том, что невидимый модальный диалог Swing «блокирует» приложение Swing, пока пользователь не закроет FileChooser. Это отлично работает.
Единственная проблема в том, что FileChooser может быть перемещен в фоновый режим. Было бы хорошо для меня установить alwaysOnTop = true
, но не смог найти способ сделать это. Есть предложения?