Не заполняется 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
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет