JavaFX Scene Builder - можно ли его использовать с JFXPanel в Swing
Я использую JavaFX в приложении Swing с JFXPanel. Я кодирую JavaFX UI вручную, с помощью CSS-файлов. Я использую NetBeans 8.1.
Мне интересно, в этом случае, могу ли я использовать JavaFX Scene Builder для генерации пользовательского интерфейса? AFAIK, вывод - файл FXML, который представляет компоненты пользовательского интерфейса. Это совместимо с JFXPanel способ использования JavaFX?
Спасибо!
1 ответ
Если вы хотите управлять JFXPanel
сам, и компоненты Swing, в Scene Builder, тогда краткий ответ "Нет".
С чисто практической точки зрения SceneBuilder не поддерживает компоненты Swing, что вы и собираетесь добавить в свой JFXPanel
,
Другая проблема связана с потоками. Scene Builder просто генерирует FXML. FXML загружается FXMLLoader
через одну из своих load(...)
методы. Этот метод обязательно должен выполняться в одном потоке. Если вы смешиваете компоненты Swing и компоненты JavaFX, вы должны соответствующим образом управлять потоками, как описано в JFXPanel
документация Поскольку у вас нет возможности рассказать FXMLLoader
какие части FXML обрабатывать в потоке приложений JavaFX, а какие обрабатывать в потоке диспетчеризации событий AWT, невозможно загрузить файл FXML, описывающий сочетание компонентов Swing и JavaFX, которые подчиняются правилам потоков обоих инструментариев,
Очевидно, вы можете использовать Scene Builder только для управления содержимым JFXPanel
; это идентично "регулярному" использованию Scene Builder. Опять же, все, что делает Scene Builder - это генерирует FXML, а FXML - это просто описание того, какие объекты создавать и как они связаны друг с другом. Так что вы можете просто сделать
private JFXPanel jfxPanel ;
// build Swing components, initialize jfxPanel, etc
// run on FX Application Thread:
private void initFX() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/fxml/file"));
Parent root = loader.load();
Scene scene = new Scene(root);
jfxPanel.setScene(scene);
}