Динамически изменяемое количество столбцов в JTable - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть JTable и TableModel, которые расширяются AbstractTableModel. Я хотел бы динамически установить количество столбцов в таблице. Я реализовал это, добавив атрибут к моему TableModel named column_count, и getColumnCount вернул column_count Я также добавил метод setColumnCount, который устанавливает column_count и вызывает fireTableStructureChanged. К сожалению, когда я запускал программу, я продолжал получать ArrayIndexOutOfBounds исключений. Может кто-нибудь сказать мне, что я сделал не так, или предложить лучшее решение?

Вот трассировка стека:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4 at java.util.Vector.elementAt(Unknown Source) at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintGrid(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source) at javax.swing.plaf.ComponentUI.update(Unknown Source) at javax.swing.JComponent.paintComponent(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) at javax.swing.RepaintManager.paint(Unknown Source) at javax.swing.JComponent._paintImmediately(Unknown Source) at javax.swing.JComponent.paintImmediately(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Ответы [ 3 ]

0 голосов
/ 08 декабря 2010

Я думаю, что исключение вызвано следующим образом:

  1. Вы задаете для внутреннего column_count значение + 1
  2. Вы запускаете события, которые вызывают визуальное обновление таблицы
  3. Когда код обновления JTable обращается к последнему столбцу, внутренний Вектор в модели столбца выдает исключение.

Возможно, причина в том, что базовый код DefaultTableColumnModel не знает о новом столбце, а его вектор не был должным образом изменен.

Чтобы исправить это, вы, вероятно, должны написать свой собственный TableColumnModel, который может корректно работать с изменением размеров.

0 голосов
/ 29 июля 2015

Вызов метода setModel(tm) из JTable с тм измененным TableModel решил похожую ошибку в моем случае.

0 голосов
/ 07 декабря 2010

Где ваш метод getValueAt() берет данные? Если это ArrayList и вы увеличиваете размер столбца, таблица попытается извлечь этот столбец из списка и сгенерировать исключение.

Если это не проблема, либо используйте DefaultTableModel и DefaultTableModel.addColumn () для добавления столбцов, либо убедитесь, что вы вносите какие-либо изменения в модель таблицы из потока обработки событий.

...