package ru.egspt; 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; fireTableDataChanged(); } /** * Настройка заголовков отчета * @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()); //System.out.println("Пишем заголовок: " + report.getQuizes().get(i).getName()); header.add(""); i++; } return header.toArray(); } /** * @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()]; System.out.println("Количество столбцов Object[][] d: " + (3 + 2*report.getQuizes().size())); System.out.println("Количество строк Object[][] d: " + report.getUsers().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()){ //перебираем результаты, ищем результаты по текущему опросу 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()); } } resultCurr++; } quizCurr++; } //пишем строку в d int j = 0; while (j < string.size()){ //while (j < 3){ d[userCurr][j] = string.toArray()[j]; j++; } userCurr++; } this.data = d; fireTableDataChanged(); } /** * @return the data */ public Object[][] getData() { return data; } }