当前位置: 首页 > 知识库问答 >
问题:

细胞修饰,JTable

伍捷
2023-03-14

我的项目涉及一个带有自定义表格模型的JTable。因为我希望用户能够修改表中的每个单元格,所以我选择让我的自定义TableModel(CSVModel)扩展DefaultTableModel。然而,由于某些原因,当我试图编辑表中的单元格时,CSVModel会抛出一个异常。我得到的唯一提示来自堆栈跟踪的最后一行:

java线程“AWT-EventQueue-0”中出现异常。lang.ArrayIndexOutofBounds异常:3

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

完整的堆栈跟踪:

java线程“AWT-EventQueue-0”中出现异常。lang.ArrayIndexOutofBounds异常:3

谢谢你的帮助!

共有1个答案

越开畅
2023-03-14

解决方案是扩展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);
        }
 类似资料:
  • 我想更改树视图中展开/取消展开的公开节点,而不使用CSS的-fx背景图像。箭头,因为尽管图像是9*9像素,但显示效果很差。我想用setCellFactory,但我不知道怎么用。 我有几个问题: > 在setCellFactory中,覆盖call或updateItem方法的目的是什么?在这种情况下要覆盖哪个? updateItem中的item==null或boolean empty=true有什么不

  • 细胞自动机(CA)是一个世界的模型,带有非常简单的物理。 “细胞”的意思是世界被分成一个大口袋,称为细胞。 “自动机”是一台执行计算的机器 - 它可能是一台真机。 ,但更多时候,“机器”是数学抽象或计算机的模拟。 本章介绍了史蒂文沃尔夫勒姆(Steven Wolfram)在 20 世纪 80 年代进行的实验,表明一些细胞自动机展示出令人惊讶的复杂行为,包括执行任意计算的能力。 我讨论了这些结果的含

  • Urban Müller 1993年的Brainfuck据说有一个“至少”30000个细胞的磁带寄存器。然而,考虑到语言主要是在base 2中交易,我想知道他的“磁带”(历史上)是否有单元格。 它说了穆勒使用的细胞的确切数量吗?

  • 今天早上,我下载了Cytoscape,我再也无法成功打开该应用程序。 在此之前,我使用的是(我相信?)也没有遇到任何问题。我在一台装有Windows10的笔记本电脑上工作。 任何帮助或洞察力将非常感谢!

  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • 类的修饰 修饰器(Decorator)是一个函数,用来修改类的行为。这是ES7的一个提案,目前Babel转码器已经支持。 修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,修饰器能在编译阶段运行代码。 function testable(target) { target.isTestable = true; } @testable class MyTestableClas