【发布时间】:2013-12-13 13:24:17
【问题描述】:
我的项目涉及一个带有自定义 TableModel 的 JTable。由于我希望用户能够修改表格中的每个单元格,因此我选择让我的自定义 TableModel (CSVModel) 扩展 DefaultTableModel。但是,由于某种原因,当我尝试编辑表格中的单元格时,CSVModel 会引发异常。我唯一的提示来自堆栈跟踪的最后一行:
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3 >= 0 at
3 是我试图修改的单元格的行号。所以也许是我的数据超出范围的问题?代码如下:
class CSVModel extends DefaultTableModel {
private String[] columnNames;
private ArrayList<String[]> Data = new ArrayList<String[]>();
public void AddCSVData(ArrayList<String[]> DataIn) {
this.columnNames = DataIn.get(0);
DataIn.remove(0);
this.Data=DataIn;
this.fireTableStructureChanged();
}
@Override
public int getColumnCount() {
if (columnNames != null)
return columnNames.length;//length;
else
return 0;
}
@Override
public int getRowCount() {
if (Data != null)
return Data.size();
else
return 0;
}
public void setRowCount() {
Data=null;
columnNames=null;
this.fireTableStructureChanged();
}
@Override
public String getColumnName(int col) {
System.out.println("getcol");
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col)
{
return Data.get(row)[col];
}
public ArrayList<String[]> ReadCSVFile(File dataFile) {
// When user presses load, read in the selected CSV file
CSVFile temp = new CSVFile();
return temp.ReadCSVfile(dataFile);
}
在编辑之前,我使用此类将 CSV 文件加载到表中:
public class CSVFile {
private ArrayList<String[]> Rs = new ArrayList<>();
private String[] OneRow;
// Method for reading CSV file
public ArrayList<String[]> ReadCSVfile (File DataFile) {
try {
BufferedReader brd = new BufferedReader (new FileReader(DataFile));
String st = brd.readLine();
while (st != null) {
OneRow = st.split(",");
Rs.add(OneRow);
st = brd.readLine();
} // end of while
brd.close();
} // end of try
catch (Exception e) {
String errmsg = e.getMessage();
System.out.println ("File not found:" +errmsg);
} // end of Catch
return Rs;
}// end of ReadFile method
}// end of CSVFile class
完整的堆栈跟踪:
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3 >= 0 在 java.util.Vector.elementAt(未知来源) 在 javax.swing.table.DefaultTableModel.setValueAt(未知来源) 在 javax.swing.JTable.setValueAt(未知来源) 在 javax.swing.JTable.editingStopped(未知来源) 在 javax.swing.AbstractCellEditor.fireEditingStopped(未知来源) 在 javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(未知来源) 在 javax.swing.DefaultCellEditor.stopCellEditing(未知来源) 在 javax.swing.JTable$GenericEditor.stopCellEditing(未知来源) 在 javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(未知来源) 在 javax.swing.JTextField.fireActionPerformed(未知来源) 在 javax.swing.JTextField.postActionEvent(未知来源) 在 javax.swing.JTextField$NotifyAction.actionPerformed(未知来源) 在 javax.swing.SwingUtilities.notifyAction(未知来源) 在 javax.swing.JComponent.processKeyBinding(未知来源) 在 javax.swing.JComponent.processKeyBindings(未知来源) 在 javax.swing.JComponent.processKeyEvent(未知来源) 在 java.awt.Component.processEvent(未知来源) 在 java.awt.Container.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.KeyboardFocusManager.redispatchEvent(未知来源) 在 java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(未知来源) 在 java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(未知来源) 在 java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(未知来源) 在 java.awt.DefaultKeyboardFocusManager.dispatchEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Window.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.EventQueue.dispatchEventImpl(未知来源) 在 java.awt.EventQueue.access$200(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源)
感谢您的帮助!
【问题讨论】:
标签: scope jtable tablemodel