Ho un problema durante l'aggiunta di righe al mio tablemodel per il mio jxtable.
La seguente eccezione verrà generata:
Exception in thread "Thread-9" java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(DefaultRowSorter.java:904)
at javax.swing.DefaultRowSorter.rowsInserted(DefaultRowSorter.java:844)
at javax.swing.JTable.notifySorter(JTable.java:4258)
at javax.swing.JTable.sortedTableChanged(JTable.java:4106)
at javax.swing.JTable.tableChanged(JTable.java:4383)
at org.jdesktop.swingx.JXTable.tableChanged(JXTable.java:1524)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:215)
at javax.swing.table.DefaultTableModel.insertRow(DefaultTableModel.java:359)
at javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:333)
at javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:344)
at de.mudisar.MainWindow.addRow(MainWindow.java:2358)
at de.mudisar.dataloader.SelectionDataLoader.run(SelectionDataLoader.java:46)
Chiamo il metodo che riempie il modello da un thread perché potrebbe essere più di 10000 voci e in caso contrario il mio programma verrà congelato.
Mi dispiace di non poter incollare il codice ma questo è molto critico nella mia azienda.
L'eccezione arriva a quella linea se faccio:
infomodel.addRow(new Object[{1,2,3,4,5,6,7,8});
Qualcuno ha un'idea del perché questa eccezione si verifica?
Con i migliori
risposte:
3 per risposta № 1Exception in thread "Thread-9" java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(DefaultRowSorter.java:904)
at javax.swing.DefaultRowSorter.rowsInserted(DefaultRowSorter.java:844)
at javax.swing.JTable.notifySorter(JTable.java:4258)
Thread-9
non suona come l'EDT. Non dovresti modificare il modello che è già collocato su un tavolo su un altro filo dell'EDT. Vedere il Concorrenza in swing tutorial per ulteriori informazioni.
Potresti usare per es. SwingUtilities.invokeLater
per pianificare l'aggiornamento dell'EDT. O nel caso in cui devi ri-popolare l'intero modello, potrebbe essere più facile crearne uno nuovo TableModel
sul thread di lavoro e sostituire il modello in una volta sull'EDT
1 per risposta № 2
Forse aggiungi troppe colonne a una riga, più di quante ce ne siano nel modello.