AbstractTableModel getValueAt perfomance

1

Я новичок в JTable, может быть, я что-то не понимаю.

Предположим, что у ArrayList 1000 Students (id, name, surname, age). И я хочу показать всех учеников в JTable. Насколько я понял, я должен создать StudentTableModel, что extends AbstractTableModel и установить StudentTableModel на JTable. Поэтому мы можем рассматривать StudentTableModel как "адаптер" между нашими ArrayList и таблицей. В Интернете я нашел такой пример реализации getValueAt:

 public Object getValueAt(int row, int col) {
      Student student = arrayList.get(row);
      switch (col) {
      case 0:
        return student.getId();
      case 1:
        return student.getName();
      case 2:
        return student.getSurname();
      case 3:
        return student.getAge();
      }
    }

Проблема заключается в том, что с 1000 учеников (строк) и 4 полей (столбцов) мы будем запускать этот переключатель 4000 раз. Пожалуйста, объясните, что я делаю неправильно или расскажу о лучшем решении.

  • 0
    не может быть проблемы с количеством предметов,
  • 1
    В этом нет ничего плохого. Если вы думаете, что 4000 - это большое число, не волнуйтесь, процессор ничего не считает. Единственный способ решить эту проблему - это если каждый раз выполнять запрос к базе данных, даже тогда переключение будет не проблемой, а фактическим поиском данных. Я предлагаю вам не пытаться думать о производительности, пока у вас нет фактических доказательств того, что это проблема.
Показать ещё 3 комментария
Теги:
swing
jtable
abstracttablemodel

2 ответа

2
Лучший ответ

Имея 1000 учеников (строк) и 4 поля (столбцы), мы будем запускать этот переключатель 4000 раз.

Посылка ложна, но вы должны профиль проверить. JTable использует мухи-шаблон для ячейки рендеринг, поэтому будут рассмотрены только видимые клетки. Этот упрощенный пример иллюстрирует существенный механизм. Этот связанный пример хорошо масштабируется в тысячи строк.

0

Вы можете хранить студентов в Map, который сопоставляет строки с атрибутами ученика.

Map<Integer, Object[]> students;

Метод будет выглядеть так:

public Object getValueAt(int row, int col) {
    return students.get(row)[col];
}
  • 0
    В качестве альтернативы, Map<Key, Student> ; вот связанный пример .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню