Spring Boot и Java Fx - PullRequest
       2

Spring Boot и Java Fx

0 голосов
/ 18 декабря 2018

Чтобы запустить мое приложение, я избегаю процесса "Implements CommandLineRunner", чтобы выполнить настройку, но я сталкиваюсь с проблемой в этой строке

fxmlLoader.setControllerFactory(springContext::getBean); 

, где fxmlLoader является экземпляром FxmlLoader и springContext iaэкземпляр ConfigurableApplicationContext.Я сталкиваюсь с этой ошибкой,

"Метод setControllerFactory(Callback<Class<?>,Object>) в типе FXMLLoader не применим для аргументов (springContext::getBean)".

Может кто-нибудь помочь мне сточный синтаксис?Мой импортированный пакет сообщает об ошибке как

«Тип org.springframework.beans.factory.annotation.Autowire не может быть разрешен. На него косвенно ссылаются необходимые файлы .class».

1 Ответ

0 голосов
/ 20 декабря 2018

хорошо, я 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);
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...