java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 试图填充 JTable
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1732503/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 attempting to populate JTable
提问by Chris K
I'm subclassing JTable and using a DefaultTableModel to model my table data. The following class sets up the JTable, and adds one row to the model.
我正在继承 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<File> SelectedFiles = new Vector<File>();
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<File> iterator() {
return SelectedFiles.iterator();
}
}
At display/visualization time, the following exception is thrown:
在显示/可视化时,抛出以下异常:
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)
I'm ripping my hair out - I haven't been able to find the root cause of this immensely simple use case.
我正在扯头发 - 我一直无法找到这个非常简单的用例的根本原因。
采纳答案by Dmitry
I think you need to add columns to your TableModel. Your code adds UI columns to the table but doesn't add them to the model
我认为您需要向 TableModel 添加列。您的代码将 UI 列添加到表中,但不会将它们添加到模型中
回答by Thimmayya
From the JTable.setAutoCreateColumnsFromModel() API:
从 JTable.setAutoCreateColumnsFromModel() API:
"This method calls createDefaultColumnsFromModel if autoCreateColumnsFromModel changes from false to true. "
“如果 autoCreateColumnsFromModel 从 false 变为 true,则此方法调用 createDefaultColumnsFromModel。”
Vector throws ArrayIndexOutOfBoundsException - if the index is out of range ( index < 0 || index >= size())
Vector 抛出 ArrayIndexOutOfBoundsException - 如果索引超出范围( index < 0 || index >= size() )
I guess the table model is missing the columns, as suggested by Dmitry
我猜表模型缺少列,正如 Dmitry 所建议的
回答by jitter
Dmitry is right. Replace
德米特里是对的。代替
this.addColumn(ColumnName);
this.addColumn(ColumnSize);
this.addColumn(ColumnRmIcon);
with
和
Model.addColumn(ColumnName);
Model.addColumn(ColumnSize);
Model.addColumn(ColumnRmIcon);
and now the Model knows about the columsn and won't throw an Exception anymore when you try to add a row to a model which thinks it has 0 columns
现在模型知道了 columsn 并且当您尝试向认为它具有 0 列的模型添加一行时不会再抛出异常
回答by satya
Replace your code with the followingHere you need to remove first row only that should be iterated for all the rows
用以下代码替换您的代码在这里,您只需要删除应该为所有行迭代的第一行
private void refreshTable() {
int rowCount= model.getRowCount();
// System.out.println(rowCount);
for(int i=0;i<rowCount;i++ ){
model.removeRow(0);
//System.out.println(i);
}
}
回答by Séverin
I ran on this issue too (with a JList and a DefaultListModel). Dmitry's answer is right.
我也在这个问题上运行过(使用 JList 和 DefaultListModel)。德米特里的回答是正确的。
However, there is another thing: this exception can also be thrown if you don't modify the model in Swing's Event Dispatch Thread.
但是,还有一点:如果没有在 Swing 的 Event Dispatch Thread 中修改模型,也会抛出这个异常。
Doing the following can help you avoid this 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
http://www.javakb.com/Uwe/Forum.aspx/java-gui/3012/JList-JScrollPane-DefaultListModel-Updating
回答by Hayri
Another issue mightbe related when you use RowSorter
. When you edit the model RowSorter
triesto re-sort the old model. It should be automatically re-created and re-run on each changes of table model.
另一个问题可能会当您使用有关RowSorter
。当您编辑模型时,RowSorter
尝试重新排序旧模型。它应该在表模型的每次更改时自动重新创建和重新运行。
You can fix it by
你可以通过
tableModel = new DefaultTableModel(data, columnNames);
jTableSentence.setModel(tableModel);
jTableSentence.setRowSorter(new TableRowSorter(tableModel));
jTableSentence.setAutoCreateRowSorter(true);
-Hayri
-海里
回答by yuriy
replace
代替
tabWindow.addTab(...);
with
和
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
tabWindow.addTab(...);
}
});
Such situation can hapen when you change tabbed pane in action listener.
当您在动作侦听器中更改选项卡式窗格时,可能会发生这种情况。
回答by Sandeep Dass
I was facing this problem because i was adding columns and rows to the JTable not to the model.
我面临这个问题是因为我将列和行添加到 JTable 而不是模型。
best way is this.
最好的办法是这个。
Object[][]rows = new Object[ ][ ] { {"a","b"} , {"c","d"} };
Object[]columns = new Object[] {"column1","column2"};
JTable table = new JTable();
table.setModel(new DefaultTableModel(rows,columns));
回答by Eldorim
Dmitry is right, but you simply have to update your model. To do this, add the following to your code:
Dmitry 是对的,但您只需要更新您的模型。为此,请将以下内容添加到您的代码中:
DefaultTableModel dtm = (DefaultTableModel) table.getModel();
for (int c = 0; c < table.getColumnCount(); c++) {
dtm.addColumn(table.getColumnName(c));
}
回答by chamzz.dot
It is necessary to add isCellEditable
method to your table model class with return false.
有必要isCellEditable
使用 return false 向表模型类添加方法。
@Override
public boolean isCellEditable(int row, int column)
{
return false;
}