Есть календарь, в календаре есть месяцы, у месяца есть массив 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; } }