package ru.egspt; import java.time.LocalTime; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class ReportTableModel extends AbstractTableModel{ private Object[] header; private Object[][] data; //создаем модель без данных public ReportTableModel(){} public ReportTableModel(Object[] header, Object[][] data){ setHeader(header); setData(data); } //создаем модель по данным Data public ReportTableModel(Data data){ setHeader(getHeaderByQuize(data)); setData(data); } //создаем модель по данным предварительно переданным в App public ReportTableModel(App app){ setHeader(getHeaderByQuize(app.getData())); setData(app.getData()); } @Override public int getRowCount() { return getData().length; } @Override public int getColumnCount() { return getHeader().length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return getData()[rowIndex][columnIndex]; } /** * @param header the header to set */ public void setHeader(Object[] header) { this.header = header; } /** * Настройка заголовков отчета * @param data */ public Object[] getHeaderByQuize(Data report){ /** * Определение количества заголовков: * первые три заголовка определяются таблицей пользователей и всегда постоянны * остальные заголовки определяются: * количеством тестов, в прохождении которых участвовали пользователи, помноженным на * количество отчетных данных (результат сдачи теста и время потраченное на прохождение теста) */ ArrayList header = new ArrayList(); header.add("id"); header.add("login"); header.add("mail"); //заголовки по названиям опросов int i = 0; while (i < report.getQuizes().size()){ header.add(report.getQuizes().get(i).getName()); header.add(""); i++; } //преобразуем список в массив Object[] h = new Object[header.size()]; int j = 0; while (j < header.size()){ h[j] = header.get(j); j++; } return h; } /** * @return the header */ public Object[] getHeader() { return header; } /** * */ public void setData(Object[][] data){ this.data = data; } /** * добавить проверку соответствия данных поля и заголовка столбца */ public void setData(Data report) { //создаем объект data - инициализация переменной Object[][] d = new Object[report.getUsers().size()][3 + 2*report.getQuizes().size()]; //формируем строку заголовков Object[] header = new Object[3 + 2*report.getQuizes().size()]; int i = 0; header[i] = "id"; i++; header[i] = "login"; i++; header[i] = "mail"; i++; int j = 0; while (j < report.getQuizes().size()){ header[i] = report.getQuizes().get(j).getName(); i++; header[i] = "time"; i++; j++; } //заголовки в консоль int h = 0; while (h < header.length){ System.out.println("header " + h + ": " + header[h]); h++; } //построчно заполняем модель отчета данными int userCurr = 0;//номер строки в отчете while (userCurr < report.getUsers().size()){ int col = 0;//номер столбца в строке //заполняем данные пользователя (имя и почту) d[userCurr][col] = report.getUsers().get(userCurr).getId(); col++; d[userCurr][col] = report.getUsers().get(userCurr).getLogin(); col++; d[userCurr][col] = report.getUsers().get(userCurr).getMail(); col++; //Заполняем результаты тестирвоания пользователя //Перебираем результаты, получаем результаты текущего пользователя int resultCurr = 0; while (resultCurr < report.getResults().size()){ if (report.getResults().get(resultCurr).getUserid() == report.getUsers().get(userCurr).getId()){ //если текущий результат относится к текущему пользователю //взять индекс теста из результата и сопоставить с полями заголовков (определить номер ячейки для формирования записи) String quizname = ""; int quizCurr = 0; while (quizCurr < report.getQuizes().size()){ if (report.getResults().get(resultCurr).getQuizid() == report.getQuizes().get(quizCurr).getId()){ quizname = report.getQuizes().get(quizCurr).getName(); } quizCurr++; } //поиск индекса ячейки, куда писать результаты int ihead = 0; int headerCurr = 0;//номер ячейки в которую писать результаты тестирования (+2) while (ihead < header.length){ if (quizname.equals(header[ihead])){ headerCurr = ihead; ihead++; } ihead++; } //формируем ячейку grade d[userCurr][headerCurr] = report.getResults().get(resultCurr).getGrade(); //формируем ячейку time Long time = report.getResults().get(resultCurr).getTime(); String t = LocalTime.MIN.plusSeconds(time).toString(); d[userCurr][headerCurr + 1] = t; } resultCurr++; } userCurr++; } setData(d); } /** * @return the data */ public Object[][] getData() { return data; } public void toConsole(){ //заголовки int i = 0; while (i < getHeader().length){ System.out.print(getHeader()[i] + " "); i++; } System.out.println(); //данные i = 0; while (i < getData().length){ int j = 0; while (j < getData()[i].length){ System.out.print(getData()[i][j] + " "); j++; } System.out.println(); i++; } System.out.println(getHeader().toString()); } }