JavaFX сделать доступным инстанс MainXMLController в других котроллерах?

76
04 ноября 2021, 01:50

Есть три контроллера CategoryListController, DrawerContentController, PopupContentController; И есть еще главный контроллер MainXMLController каждый контроллер использует свой fxml файл для отрисовки но для всех контроллеров нужен инстанс MainXMLController'a Сейчас у меня в каждом контроллер есть такой метод getMainController

public MainXMLController getMainController(){ 
       FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/views/main.fxml"));
       return (MainXMLController) fxmlLoader.getController(); }

Создал BaseController в него перенес метод getMainController и все три контроллера теперь наследуются с BaseController но когда вызываю getMainController например с CategoryListController получаю NullPointer. Что не так ?

public class BaseController {
    protected MainXMLController mainXMLController;
    public MainXMLController getMainXMLController() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/views/main.xml.fxml"));
        return fxmlLoader.getController();
    }

}

public class CategoryListController extends BaseController implements Initializable {
@FXML
private JFXListView<CategoryModel> categoryList;
private CategoryModel categoryModel = new CategoryModel();;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    renderCategoryList(categoryModel.getAllCategory());
    setEventListnerListvView();
}
private void setEventListnerListvView(){
    EventHandler<MouseEvent> handler = mouseEvent -> {
        CategoryModel selectedItem = categoryList.getSelectionModel().getSelectedItem();
        if (selectedItem != null) {
            System.out.println("id = " + selectedItem.getId());
            //initMainController();
            if(getMainController() != null){
                getMainController().setTypeItText(selectedItem.getCategoryName());
            } else {
                System.out.println("Ctrl is null");
            }
        } else {
            System.out.println("no item selected");
        }
    };
    categoryList.addEventFilter(MouseEvent.MOUSE_CLICKED, handler);
}
private void renderCategoryList(ResultSet resultSet){
    categoryList.setCellFactory(lv -> new LVCellViewHolder<>(){
        @Override
        protected void updateItem(CategoryModel item, boolean empty) {
            super.updateItem(item, empty);
            setText(empty || item == null ? "" : item.getCategoryName());
        }
    });
    ObservableList categoryListRow = FXCollections.observableArrayList();
    try {
        while (resultSet.next()) {
            categoryListRow.add(new CategoryModel(resultSet.getInt("id"), resultSet.getString("category_name")));
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    categoryList.setItems(categoryListRow);
}
public Node getView(){
    return categoryList;
}

}

READ ALSO
Изображения не отображаются в recyclerview из FireBase storage [закрыт]

Изображения не отображаются в recyclerview из FireBase storage [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

85
log4j изменение название файла

log4j изменение название файла

Как в log4jxml изменять название файла, куда будут сохраняться логи, во время программы?

181
Подключение к базе данных MS SQL

Подключение к базе данных MS SQL

Цель: Правильно прописать путь в applicationproperties для возможности отправки данных в базу данных MS SQL

108
Как забрать данные в определённой строке из таблицы при условии что есть номер?

Как забрать данные в определённой строке из таблицы при условии что есть номер?

Есть таблица в которой есть номер лота и ценаУсловие: нужно собрать цену из той строки таблицы где есть номер ЕИС

229