要启动我的应用程序,我避免使用“ implements CommandLineRunner”过程来进行设置,但此行遇到了问题
fxmlLoader.setControllerFactory(springContext::getBean);
其中,fxmlLoader是FxmlLoader的实例,而springContext是ConfigurableApplicationContext的实例。我遇到此错误,
”该方法中的方法
setControllerFactory(Callback<Class<?>,Object>)
FXMLLoader类型不适用于该参数(springContext::getBean)
”。
有人可以用确切的语法帮助我吗?我导入的软件包报告错误为
“类型org.springframework.beans.factory.annotation.Autowire 无法解决。从必需的.class间接引用 文件”。
答案 0 :(得分:0)
好吧,我ve understood that this would require a little code, but i
发现了已经建立的项目,其解决方案类似于我的ve proposed - here
示例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);
}
}
并像豆子一样绑住所有视图
@Configuration
公共类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;
}
}
}
然后在控制器中,您可以一起享受spring magic和javafx magic
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);
}}