В моем проекте используется JTable с пользовательской TableModel. Поскольку я хочу, чтобы пользователь мог изменять каждую ячейку в таблице, я предпочитаю, чтобы моя настраиваемая TableModel (CSVModel) расширяла DefaultTableModel. Однако по какой-то причине CSVModel выдает исключение, когда я пытаюсь изменить ячейку в своей таблице. Единственный намек, который у меня есть, это последняя строка трассировки стека:
Исключение в потоке "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 0 в
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
Полная трассировка стека:
Спасибо за помощь!
Решение состояло в том, чтобы расширить AbstractTableModel вместо DefaultTableModel. Мне также пришлось включить соответствующим образом перегруженные версии двух методов AbstractTableModel: