package ru.egspt; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; 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()]; //построчно заполняем модель отчета данными int userCurr = 0; while (userCurr < report.getUsers().size()){ ArrayList string = new ArrayList<>();//новая строка отчета //пишем данные пользователя (первые три столбца) string.add(report.getUsers().get(userCurr).getId()); string.add(report.getUsers().get(userCurr).getLogin()); string.add(report.getUsers().get(userCurr).getMail()); Boolean find = false; //перебираем остальные заголовки (перечень опросов) int quizCurr = 0; while (quizCurr < report.getQuizes().size()){ if (find == false){ //перебираем результаты, ищем результаты по текущему опросу int resultCurr = 0; while (resultCurr < report.getResults().size()){ //если текущий результат относится к текущему опросу: if (report.getResults().get(resultCurr).getQuizid() == report.getQuizes().get(quizCurr).getId()){ //если текущий результат относится к текущему пользователю if (report.getResults().get(resultCurr).getUserid() == report.getUsers().get(userCurr).getId()){ string.add(report.getResults().get(resultCurr).getGrade()); string.add(report.getResults().get(resultCurr).getTime()); find = true; } } resultCurr++; } } else{ string.add(" "); string.add(" "); find = false; } find = false; quizCurr++; } //пишем строку в d int j = 0; while (j < string.size()){ d[userCurr][j] = string.toArray()[j]; j++; } 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()); } }