Spring Boot和Java Fx

时间:2018-12-18 06:48:24

标签: spring-boot javafx

要启动我的应用程序,我避免使用“ implements CommandLineRunner”过程来进行设置,但此行遇到了问题

fxmlLoader.setControllerFactory(springContext::getBean); 

其中,fxmlLoader是FxmlLoader的实例,而springContext是ConfigurableApplicationContext的实例。我遇到此错误,

  

”该方法中的方法setControllerFactory(Callback<Class<?>,Object>)   FXMLLoader类型不适用于该参数   (springContext::getBean)”。

有人可以用确切的语法帮助我吗?我导入的软件包报告错误为

  

“类型org.springframework.beans.factory.annotation.Autowire   无法解决。从必需的.class间接引用   文件”。

1 个答案:

答案 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);
}}