Метод TableModel getValueAt () вызывается средством визуализации таблиц каждый раз, когда оно хочет получить значение ячейки, чтобы оно могло ее визуализировать.Это не связано (прямо или надежно) с тем, что вы щелкаете по строке таблицы и помечаете ее как выбранную.
Другими словами, вы не хотите изменять состояние вашей табличной модели какрезультат вызова метода getValueAt()
.
Было бы проще всего, если бы ваш метод getValueAt()
использовал строку в качестве индекса в вашем массиве.Однако, похоже, у вас есть переменное количество строк для каждого модуля.В этом случае, если вы не можете алгоритмически сгенерировать правильный индекс, вы можете «сгладить» данные один раз в конструкторе и упростить код поиска.
То есть ваша табличная модель содержит:
private List<RowData> rowData
и внутренний класс, содержащий данные строки:
private static class RowData
{
private Moddule;
private Assignment assignment;
...
}
И в вашем конструкторе:
public AssignmentsTableModel(List<Module> modules)
{
this.rowData = new ArrayList<Module>();
for (Module module : modules)
{
for (Assignment assignment : module.getAssignments())
{
rowData.add(new RowData(module, assignment));
}
}
}
Это упрощает ваш getValueAt()
метод:
@Override
public Object getValueAt(int row, int column) {
final RowData row = this.rowData.get(row);
switch (column){
case 0: return row.getModule().getIdentifier();
case 1: return row.getModule().getTitle();
case 2: return row.getAssignment().getTitle();
case 3: return row.getAssignment().Author();
case 4: return row.getAssignment().getSet();
case 5: return row.getAssignment().getDue();
case 6: return row.getAssignment().getWeighting();
default: return null;
}
}