#java #swing #jtable #indexoutofboundsexception #defaulttablemodel
#java #swing #jtable #исключение indexoutofboundsexception #defaulttablemodel
Вопрос:
Я хотел бы сохранить и отобразить данные из базы данных в JTable и попытался использовать DefaultTableModel для этого. Тем не менее, я получаю:
ArrayIndexOutOfBoundsException at com.mycompany.bazadanych.main.main(main.java:40) (line with ** **).
Существует ли способ предопределить количество столбцов / строк в JTable и просто передать им данные?
public static void main(String[] args) {
bazaDanych BazaDanych = new bazaDanych();
DefaultTableModel tableModel = new DefaultTableModel();
JTable table = new JTable(tableModel);
tableModel.setColumnCount(3);
try {
//BazaDanych.wstawDane("STUDENCI", "Kowalski", "Jan");
//BazaDanych.wstawDane("STUDENCI", "Wiśniewski", "Piotr");
//BazaDanych.wstawDane("STUDENCI", "Nowak", "Michał");
BazaDanych.usunDane("STUDENCI", "Nowak", "Michał");
} catch (SQLException ex) {
ex.printStackTrace();
}
List<Student> lista = BazaDanych.pobierzDane("STUDENCI");
BazaDanych.zamknijPolaczenie();
lista.forEach(s -> {
**table.setValueAt(s.getId(), s.getId(), 0);**
table.setValueAt(s.getNazwisko(), s.getId(), 1);
table.setValueAt(s.getImie(), s.getId(), 2);
//tableModel.addRow(new Object[] {s.getId(), s.getNazwisko(), s.getImie()});
System.out.println(s.getId() " " s.getNazwisko() " " s.getImie());
});
table.updateUI();
//stable.setModel(tableModel);
JFrame frame = new JFrame("Demo program for JFrame");
frame.setLayout(null);
frame.add(table);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.pack();
}
}
Ответ №1:
Существует ли способ предопределить количество столбцов / строк в JTable и просто передать им данные?
Откуда вы знаете, каким должен быть предопределенный размер таблицы?
Ваши данные содержатся в списке учащихся. Лучшим подходом было бы:
- Создайте пользовательский
StudentTableModel
. Тогда нет необходимости в цикле forEach. Вы просто создаете модель, используяList<Student>
. Пошаговый пример создания пользовательской модели приведен в разделе Модель таблицы строк. - Используйте
addRow(...)
методDefaultTableModel
, указанный в вашем коде. Это означает, что вам нужно избавиться отsetValueAt(...)
операторов.
Другие проблемы с кодом:
- Не используйте updateUI() . Компоненты Swing автоматически перерисовывают себя при обновлении модели.
- Не используйте нулевой макет. Swing был разработан для использования с менеджерами компоновки.
- Обычно JTable используется с JScrollPane, а панель прокрутки добавляется во фрейм.