Модификация ячеек, JTable

В моем проекте используется 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:


person Adam    schedule 13.12.2013    source источник


Ответы (1)


Исключение в потоке «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.proc essKeyBinding (неизвестный источник) в 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(неизвестный источник)

@Override
 public boolean isCellEditable(int row, int col) {
            return true;
          }
@Override
        public void setValueAt(Object value, int row, int col) {

            Data.get(row)[col] = (String) value;

            fireTableCellUpdated(row, col);
        }
person Adam    schedule 13.12.2013