Инициализация Java Fx

140
03 февраля 2021, 09:40

Использую Java FX, пытаюсь создать небольшое приложение с парой контроллеров и представлений с помощью Spring boot. На сколько знаю что бы использовать все плюшки DI Spring нужно правильно разделить инициализацию Spring и Java FX, поскольку сначала надо пройти инициализацию Java FX, и только после этого вся польза спринга будет доступна(в моем случае DI сервисов и контроллеров). Есть класс:

@Component
public class TableController {
    @FXML private TableView<File> table;
    @Autowired private Service service;
    private ObservableList observableList;
    private List<File> ioList;
    public TableController() {}
    public File getSelectedItem() {
        return table.getSelectionModel().getSelectedItem();
    }
    @FXML
    private void initialize(){
        System.out.println("JavaFx init");
        TableColumn<File, String> name = new TableColumn<>("Name");
        TableColumn<File, String> file = new TableColumn<>("File");;
        TableColumn<File, String> extension = new TableColumn<>("Extension");;
        name.setCellValueFactory(new PropertyValueFactory<File, String>("name"));
        file.setCellValueFactory(new PropertyValueFactory<File, String>("file"));
        extension.setCellValueFactory(new PropertyValueFactory<File, String>("extension "));
        table.getColumns().setAll(name, singer, extension);
    }
    @PostConstruct
public void init(){
    ioList = service.getAll();
    observableList = FXCollections.observableArrayList();
    observableList.setAll(ioList);
}
    public void showItems() {
        table.setItems(observableList);
    }
}

метод showItems() вызывается в главном классе, наследнике Application, в методе start(), так вот в этот момент переменная table не проинициализирована, хотя вызов метода initialize() проходит нормально и там переменная проинициализирована, но при вызове showItems() я ловлю NPE. В чем промах?

Файл fxml этого контроллера:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="434.0" prefWidth="350.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.controller.TableController ">
    <children>
        <TableView prefHeight="434.0" prefWidth="350.0" fx:id="songs">
        </TableView>
    </children>
</AnchorPane>

UPD Как подсказал @notaProgrammer проблема в том что создается отдельные два экземпляра класса: JavaFX создает один Spring - другой. Суть вопроса не поменялась: какие есть варианты "подружить" Spring и JavaFX, что бы Spring пользовал тот класс который создает JavaFX?

Answer 1

У FXMLLoader есть такой метод:

javafx.fxml.FXMLLoader.setControllerFactory(Callback<Class<?>, Object>)

который позволяет переопределить каким образом будут создаваться экземпляры контроллеров. Нужно реализовать этот Callback, в котором будут возвращаться бины из спрингового контекста и JavaFX будет использовать их.

READ ALSO
JavaFx. Создание кнопки от точки до точки

JavaFx. Создание кнопки от точки до точки

Как в javaFx создать кнопку имеющую начальные координаты X1Y1 и конечные X2Y2, не прибегая к помощи SceneBuilder

157
NullPointerException в условии if

NullPointerException в условии if

В классе 3 метода: save, get и delete

175
Не отрабатывает Scanner во второй раз [дубликат]

Не отрабатывает Scanner во второй раз [дубликат]

Есть метод добавления товара в корзину, когда вызываю его в первый раз, всё отрабатывает корректно, когда вызываю второй раз в product ничего...

173