java.lang.ArrayIndexOutOfBoundsException:0> = 0试图填充JTable

我是子类化JTable并使用DefaultTableModel来建模我的表数据。 以下类设置JTable,并向模型添加一行。

import java.io.File; import java.util.Iterator; import java.util.Vector; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class SelectedFileTable extends JTable { Vector SelectedFiles = new Vector(); DefaultTableModel Model = new DefaultTableModel(); TableColumn ColumnName = new TableColumn(); TableColumn ColumnSize = new TableColumn(); TableColumn ColumnRmIcon = new TableColumn(); ImageFilenameFilter Filter = new ImageFilenameFilter(); public SelectedFileTable() { super(); this.setModel(Model); ColumnName.setHeaderValue(new String("Name") ); ColumnName.setMinWidth(200); ColumnSize.setHeaderValue(new String("Size") ); ColumnSize.setMinWidth(50); ColumnSize.setMaxWidth(100); ColumnRmIcon.setHeaderValue(new String("Remove?") ); ColumnRmIcon.setMaxWidth(100); ColumnRmIcon.setResizable(false); this.addColumn(ColumnName); this.addColumn(ColumnSize); this.addColumn(ColumnRmIcon); this.setShowVerticalLines(false); this.setShowHorizontalLines(true); this.setAutoCreateColumnsFromModel(true); this.addFile( new File("C:/temp/cfk.jpg") ); } public void addFile(File file) { System.out.println("FileTable adding: " + file.getName() ); if ( file.isDirectory() ) { for ( File f : file.listFiles(Filter) ) { this.addFile(f); } } else { if ( Filter.accept(file) ) { System.out.println("Accepting file; " + file.getName() ); SelectedFiles.add(file); { String name = file.getName(); Long size = new Long( file.length() ); String tempstr = new String("X"); System.out.println("RowItems before: " + Integer.toString(Model.getRowCount()) ); Model.addRow( new Object[] { name, size, tempstr } ); Model.fireTableDataChanged(); System.out.println("RowItems start : " + Integer.toString(Model.getRowCount()) ); } System.out.println("Done Accepting file; " + file.getName() ); } } } public Iterator iterator() { return SelectedFiles.iterator(); } } 

在显示/可视化时,抛出以下exception:

 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 at java.util.Vector.elementAt(Vector.java:432) at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:622) at javax.swing.JTable.getValueAt(JTable.java:1903) at javax.swing.JTable.prepareRenderer(JTable.java:3911) at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072) at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974) at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1897) at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142) at javax.swing.JComponent.paintComponent(JComponent.java:743) at javax.swing.JComponent.paint(JComponent.java:1006) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JViewport.paint(JViewport.java:728) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paint(JComponent.java:1015) at javax.swing.JLayeredPane.paint(JLayeredPane.java:559) at javax.swing.JComponent.paintChildren(JComponent.java:843) at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4979) at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4925) at javax.swing.JComponent.paint(JComponent.java:996) at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21) at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97) at java.awt.Container.paint(Container.java:1709) at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248) at sun.awt.RepaintArea.paint(RepaintArea.java:224) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:254) at java.awt.Component.dispatchEventImpl(Component.java:4060) at java.awt.Container.dispatchEventImpl(Container.java:2024) at java.awt.Window.dispatchEventImpl(Window.java:1791) at java.awt.Component.dispatchEvent(Component.java:3819) at java.awt.EventQueue.dispatchEvent(EventQueue.java:463) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149) at java.awt.EventDispatchThread.run(EventDispatchThread.java:110) 

我正在撕开我的头发 – 我无法找到这个极其简单的用例的根本原因。

我认为您需要向TableModel添加列。 您的代码将UI列添加到表中,但不会将它们添加到模型中

我也遇到了这个问题(使用JList和DefaultListModel)。 德米特里的回答是对的。

但是,还有另一件事:如果您不在Swing的事件调度线程中修改模型,也会抛出此exception。

执行以下操作可以帮助您避免此exception:

 SwingUtilities.invokeLater(new Runnable(){public void run(){ //Update the model here }}); 

http://www.javakb.com/Uwe/Forum.aspx/java-gui/3012/JList-JScrollPane-DefaultListModel-Updating

德米特里是对的。 更换

 this.addColumn(ColumnName); this.addColumn(ColumnSize); this.addColumn(ColumnRmIcon); 

 Model.addColumn(ColumnName); Model.addColumn(ColumnSize); Model.addColumn(ColumnRmIcon); 

现在模型知道columsn并且当你试图向一个认为它有0列的模型添加一行时不再抛出exception

从JTable.setAutoCreateColumnsFromModel()API:

“如果autoCreateColumnsFromModel从false更改为true,则此方法调用createDefaultColumnsFromModel。”

Vector抛出ArrayIndexOutOfBoundsException – 如果索引超出范围(index <0 || index> = size())

我猜Dmitry建议表格模型缺少列

用以下代码替换代码在这里,您需要删除应该为所有行迭代的第一行

 private void refreshTable() { int rowCount= model.getRowCount(); // System.out.println(rowCount); for(int i=0;i 

使用RowSorter可能会出现另一个问题。 编辑模型时, RowSorter 尝试重新排序旧模型。 它应该在表模型的每次更改时自动重新创建并重新运行。

你可以解决它

 tableModel = new DefaultTableModel(data, columnNames); jTableSentence.setModel(tableModel); jTableSentence.setRowSorter(new TableRowSorter(tableModel)); jTableSentence.setAutoCreateRowSorter(true); 

-Hayri

我遇到了这个问题,因为我在JTable中添加了列和行而不是模型。

最好的方法就是这样。

 Object[][]rows = new Object[ ][ ] { {"a","b"} , {"c","d"} }; Object[]columns = new Object[] {"column1","column2"}; JTable table = new JTable(); table.setModel(new DefaultTableModel(rows,columns)); 

更换

 tabWindow.addTab(...); 

 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { tabWindow.addTab(...); } }); 

在动作侦听器中更改选项卡式窗格时,这种情况可能会出现问题。

德米特里是对的,但你只需要更新你的模型。 为此,请在代码中添加以下内容:

 DefaultTableModel dtm = (DefaultTableModel) table.getModel(); for (int c = 0; c < table.getColumnCount(); c++) { dtm.addColumn(table.getColumnName(c)); } 

有必要将isCellEditable方法添加到表模型类中,并返回false。

 @Override public boolean isCellEditable(int row, int column) { return false; }