хорошо, я ve understood that this would require a little code, but i
нашел уже построенный проект с решением, аналогичным тому, что я ve proposed - here
s пример https://github.com/ruslanys/sample-spring-boot-javafx
вам нужно просто привязать javafx к весне с context.getAutowireCapableBeanFactory().autowireBean(this);
в файле AbstractJavaFxApplicationSupport.java
код будет выглядеть следующим образом
public abstract class AbstractJavaFxApplicationSupport extends Application {
private static String[] savedArgs;
protected ConfigurableApplicationContext context;
@Override
public void init() throws Exception {
context = SpringApplication.run(getClass(), savedArgs);
context.getAutowireCapableBeanFactory().autowireBean(this);
}
@Override
public void stop() throws Exception {
super.stop();
context.close();
}
protected static void launchApp(Class<? extends AbstractJavaFxApplicationSupport> appClass, String[] args) {
AbstractJavaFxApplicationSupport.savedArgs = args;
Application.launch(appClass, args);
}
}
и свяжет все, что вы видите, как bean
@Configuration
public class ControllersConfiguration {
@Bean(name = "mainView")
public ViewHolder getMainView() throws IOException {
return loadView("fxml/main.fxml");
}
@Bean
public MainController getMainController() throws IOException {
return (MainController) getMainView().getController();
}
protected ViewHolder loadView(String url) throws IOException {
InputStream fxmlStream = null;
try {
fxmlStream = getClass().getClassLoader().getResourceAsStream(url);
FXMLLoader loader = new FXMLLoader();
loader.load(fxmlStream);
return new ViewHolder(loader.getRoot(), loader.getController());
} finally {
if (fxmlStream != null) {
fxmlStream.close();
}
}
}
public class ViewHolder {
private Parent view;
private Object controller;
public ViewHolder(Parent view, Object controller) {
this.view = view;
this.controller = controller;
}
public Parent getView() {
return view;
}
public void setView(Parent view) {
this.view = view;
}
public Object getController() {
return controller;
}
public void setController(Object controller) {
this.controller = controller;
}
}
}
тогда в контроллере вы можете наслаждаться весенней магией и магией javafx вместе
public class MainController {
@Autowired private ContactService contactService;
@FXML private TableView<Contact> table;
@FXML private TextField txtName;
@FXML private TextField txtPhone;
@FXML private TextField txtEmail;}
и просто запустить свое приложение вот так
@SpringBootApplication
public class Application extends AbstractJavaFxApplicationSupport {
@Value("${ui.title:JavaFX приложение}")//
private String windowTitle;
@Qualifier("mainView")
@Autowired
private ControllersConfiguration.ViewHolder view;
@Override
public void start(Stage stage) throws Exception {
stage.setTitle(windowTitle);
stage.setScene(new Scene(view.getView()));
stage.setResizable(true);
stage.centerOnScreen();
stage.show();
}
public static void main(String[] args) {
launchApp(Application.class, args);
}}