Исключение в потоке «main» java.lang.ArrayIndexOutOfBoundsException: 1 > = 0 defaultтаблица Java

#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 и просто передать им данные?

Откуда вы знаете, каким должен быть предопределенный размер таблицы?

Ваши данные содержатся в списке учащихся. Лучшим подходом было бы:

  1. Создайте пользовательский StudentTableModel . Тогда нет необходимости в цикле forEach. Вы просто создаете модель, используя List<Student> . Пошаговый пример создания пользовательской модели приведен в разделе Модель таблицы строк.
  2. Используйте addRow(...) метод DefaultTableModel , указанный в вашем коде. Это означает, что вам нужно избавиться от setValueAt(...) операторов.

Другие проблемы с кодом:

  1. Не используйте updateUI() . Компоненты Swing автоматически перерисовывают себя при обновлении модели.
  2. Не используйте нулевой макет. Swing был разработан для использования с менеджерами компоновки.
  3. Обычно JTable используется с JScrollPane, а панель прокрутки добавляется во фрейм.