Не заполняется combobox в tableview данными из модели

 
 
 
Сообщения:3
Ошибок не выдает компилируется. Значения меняются вообщем все так кроме того что изначально ячейки не заполняются значениями.

Есть календарь, в календаре есть месяцы, у месяца есть массив enum Markcode. Этими Markcode и надо изначально заполнить таблицу. Каждая ячейка это combobox
Что я упускаю?
Класс календаря:
package model;

import java.sql.Date;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestCalendar {

        private int employeeId;
        private int currentYear;
        private Map<Date, String> dates;
        private List<Month> months;

        public TestCalendar(int year, int employee_id) {
                this.employeeId = employee_id;
                this.currentYear = year;
                this.dates = new HashMap<Date, String>();
                this.months = new ArrayList<Month>();
        }
        
        public int getEmployeeId() {
                return this.employeeId;
        }
        
        public Month getMonthById(int id) {
                return this.months.get(id-1);
        }

        public void setDatesMap(Map<Date, String> map) {
                this.dates = map;
        }

        public void prepareDatesByMonth() {
                for (int monthNum = 1; monthNum <= 12; monthNum++) {
                        YearMonth ymObject = YearMonth.of(currentYear, monthNum);
                        Month month = new Month(monthNum, ymObject.lengthOfMonth());
                        for(int dayCount = 1; dayCount <= month.maxDayCount; dayCount++) {
                                Date date = Date.valueOf(LocalDate.of(currentYear,monthNum,dayCount));
                                if(dates.containsKey(date)) {
                                        if(dates.get(date) == null) {
                                                Markcode mark = Markcode.getByMark(new String("?"));
                                                month.addDayCode(mark);
                                        }
                                        else {
                                                Markcode mark = Markcode.getByMark(new String(dates.get(date)));
                                                month.addDayCode(mark);
                                        }
                                }
                                else {
                                        Markcode mark = Markcode.getByMark(new String(new String("X")));
                                        month.addDayCode(mark);
                                }
                        }
                        this.months.add(month);
                }
        }
        
        
        public class Month {
                
                private int monthId;
                private int maxDayCount;
                private List<Markcode>dayCodes;
                
                Month (int id, int count){
                        this.monthId = id;
                        this.maxDayCount = count;
                        this.dayCodes = new ArrayList<Markcode>();
                }
                
                public int getMonthId() {
                        return monthId;
                }

                public int getDayCount() {
                        return maxDayCount;
                }
                
                public void addDayCode(Markcode code) {
                        this.dayCodes.add(code);
                }
                
                public void setDayCode(int dayId, Markcode daycode) {
                        if(!dayCodes.isEmpty())
                                dayCodes.set(dayId-1, daycode);
                }
                
                public Markcode getDayCode(int dayId) {
                        if(!dayCodes.isEmpty())
                                return this.dayCodes.get(dayId-1);
                        return null;
                }
                
                public Markcode getMarkCode(int dayId) {
                        if(!dayCodes.isEmpty()) {
                                return dayCodes.get(dayId-1);
                        }
                        return null;
                }
        }
}


Класс контроллера:
package controller;

import java.sql.SQLException;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.List;

import dao.CalendarDAO;
import dao.DepartmentDAO;
import dao.EmployeeDAO;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.util.Callback;
import model.Department;
import model.Employee;
import model.Markcode;
import model.TestCalendar;
import model.TestCalendar.Month;

public class MainController {

        
        @FXML
        private TableView<TestCalendar.Month> janTable;
        
        @FXML
        private TableView<TestCalendar.Month> febTable;
        
        @FXML
        private TableView<TestCalendar.Month> marTable;
        
        @FXML
        private TableView<TestCalendar.Month> aprTable;
        
        @FXML
        private TableView<TestCalendar.Month> mayTable;
        
        @FXML
        private TableView<TestCalendar.Month> juneTable;
        
        @FXML
        private TableView<TestCalendar.Month> julyTable;
        
        @FXML
        private TableView<TestCalendar.Month> augTable;
        
        @FXML
        private TableView<TestCalendar.Month> septTable;
        
        @FXML
        private TableView<TestCalendar.Month> octTable;
        
        @FXML
        private TableView<TestCalendar.Month> novTable;
        
        @FXML
        private TableView<TestCalendar.Month> decTable;
        
        private static int currentYear;
        private static List<TableView<TestCalendar.Month>> monthTable;
        

        @FXML
        void initialize() throws ClassNotFoundException, SQLException {
                currentYear = CalendarDAO.getCurrentYear();
                initDepartmentTable();
                initEmployeeCalendarMonthColumns();
        }

        private void initEmployeeCalendarTable(final int employee_id) throws ClassNotFoundException, SQLException{
                
                TestCalendar calendar = new TestCalendar(currentYear, employee_id);
                calendar.setDatesMap(CalendarDAO.getAllDatesForEmployee(employee_id));
                calendar.prepareDatesByMonth();
                
                //clear all
                for(int i = 1; i<=12; i++)
                        monthTable.get(i-1).getItems().clear();
                
                for(int monthId = 1; monthId <=12; monthId++) {
                        Month tmp = calendar.getMonthById(monthId);
                        ObservableList<Month> m = FXCollections.observableArrayList();
                        m.add(tmp);
                        monthTable.get(monthId-1).setItems(m);
                }
        }

        private void initEmployeeCalendarMonthColumns() {
                
                monthTable = new ArrayList<TableView<TestCalendar.Month>>();
                monthTable.add(janTable);
                monthTable.add(febTable);
                monthTable.add(marTable);
                monthTable.add(aprTable);
                monthTable.add(mayTable);
                monthTable.add(juneTable);
                monthTable.add(julyTable);
                monthTable.add(augTable);
                monthTable.add(septTable);
                monthTable.add(octTable);
                monthTable.add(novTable);
                monthTable.add(decTable);
                
                ObservableList<Markcode> markcodesList = FXCollections.observableArrayList(Markcode.values());
                
                for(int monthCount = 1; monthCount <= 12; monthCount++) {
                        YearMonth dayCount = YearMonth.of(currentYear, monthCount);
                        for(Integer monthDay = 1; monthDay <= dayCount.lengthOfMonth(); monthDay++) {
                                
                                final int dayNum = monthDay;
                                TableColumn<TestCalendar.Month, Markcode> column = new TableColumn<>(monthDay.toString());
                                
                                column.setCellValueFactory(new Callback<CellDataFeatures<TestCalendar.Month, Markcode>, ObservableValue<Markcode>>() {
                                        @Override
                                        public ObservableValue<Markcode> call(CellDataFeatures<TestCalendar.Month, Markcode> param) {
                                Month month = param.getValue();
                                Markcode mark = month.getDayCode(dayNum);
                                return new SimpleObjectProperty<Markcode>(mark);
                                        }
                        });
                                
                                column.setCellFactory(ComboBoxTableCell.forTableColumn(markcodesList));
                                
                                column.setOnEditCommit((CellEditEvent<TestCalendar.Month, Markcode> event) -> {
                            TablePosition<TestCalendar.Month, Markcode> position = event.getTablePosition();
                            Markcode newMark = event.getNewValue();
                            int row = position.getRow();
                            Month month = event.getTableView().getItems().get(row);
                            month.setDayCode(dayNum, newMark);
                        });
                                
                                monthTable.get(monthCount-1).getColumns().add(column);
                        }
                }
        }
}


ну и сам Markcode:

package model;

public enum Markcode {
        XXX(0, "?"),
        Я(1, "Я"),
        Н(2, "Н"),
        В(3, "В"),
        Рв(4, "Рв"),
        Б(5, "Б"),
        К(6, "К"),
        ОТ(7, "ОТ"),
        До(8, "До"),
        Хд(9, "Хд"),
        У(10, "У"),
        Ож(11, "Ож");

        private int code;
        private String mark;

        private Markcode(int code, String mark) {
                this.code = code;
                this.mark = mark;
        }

        public int getCode() {
                return this.code;
        }

        public String getMark() {
                return this.mark;
        }

        public static Markcode getByCode(int code) {
                for (Markcode mc : Markcode.values())
                        if (mc.code == code)
                                return mc;
                return null;
        }
        
        public static Markcode getByMark(String markcode) {
                for (Markcode mc : Markcode.values())
                        if (mc.mark == markcode)
                                return mc;
                return null;
        }

        @Override
        public String toString() {
                return this.mark;
        }
}
Изменен:03 сен 2020 15:24
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет