【问题标题】:Modification of cells, JTable修改单元格,JTable
【发布时间】: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


    【解决方案1】:

    解决方案是扩展 AbstractTableModel 而不是 DefaultTableModel。我还必须包含 AbstractTableModel 的两种方法的适当重载版本:

    @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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 2011-08-06
      • 2011-11-03
      • 1970-01-01
      • 2018-08-20
      • 2011-08-14
      • 2011-09-24
      相关资源
      最近更新 更多