Java 如何在特殊抽象模型JTable中使列可编辑

Java 如何在特殊抽象模型JTable中使列可编辑,java,swing,csv,abstracttablemodel,Java,Swing,Csv,Abstracttablemodel,嘿,伙计们,我正在做我的作业,现在我遇到了不可编辑单元格的问题,实际上它变成了可编辑的,但编辑的结果没有设置在arraylist,我尝试了许多来自internet的解决方案,但都不起作用。 所以我的工作就像注册系统一样,它获取客人的信息,然后将其存储到csv文件中。在附加功能中,程序必须具有显示、更新、删除和搜索功能 我完成了所有,没有更新,删除和搜索。你可以看看我的代码,帮助我或给我的建议,链接或一些有用的东西 这是我的抽象模型: public class ddispmodel extends

嘿,伙计们,我正在做我的作业,现在我遇到了不可编辑单元格的问题,实际上它变成了可编辑的,但编辑的结果没有设置在arraylist,我尝试了许多来自internet的解决方案,但都不起作用。 所以我的工作就像注册系统一样,它获取客人的信息,然后将其存储到csv文件中。在附加功能中,程序必须具有显示、更新、删除和搜索功能

我完成了所有,没有更新,删除和搜索。你可以看看我的代码,帮助我或给我的建议,链接或一些有用的东西

这是我的抽象模型:

public class ddispmodel extends AbstractTableModel {
private final String[] columnNames = { "FirstName", "SecondName", "Date of                                                     
birth", "Gender", "Email", "Address", "Number", "Attending","ID" };
private ArrayList<String[]> Data = new ArrayList<String[]>();
private boolean editable;


public void AddCSVData(ArrayList<String[]> DataIn) {
    this.Data = DataIn;
    this.fireTableDataChanged();
}

@Override
public int getColumnCount() {
    return columnNames.length;// length;
}

@Override
public int getRowCount() {
    return Data.size();
}

@Override
public String getColumnName(int col) {
    return columnNames[col];
}

@Override
public Object getValueAt(int row, int col) {
    return Data.get(row)[col];
}
public boolean isCellEditable(int row, int col) { 
    setValueAt(Data, row, col);
    this.fireTableCellUpdated(row, col);
    return true;
}
}
公共类ddispmodel扩展了AbstractTableModel{
私有最终字符串[]columnNames={“FirstName”、“SecondName”、“发布日期”
出生”、“性别”、“电子邮件”、“地址”、“号码”、“就诊”、“身份证”};
private ArrayList Data=new ArrayList();
私有布尔可编辑;
public void AddCSVData(ArrayList DataIn){
this.Data=DataIn;
this.fireTableDataChanged();
}
@凌驾
public int getColumnCount(){
返回columnNames.length;//长度;
}
@凌驾
public int getRowCount(){
返回Data.size();
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据。获取(行)[col];
}
公共布尔值isCellEditable(int行,int列){
setValueAt(数据、行、列);
此.firetablecell已更新(行、列);
返回true;
}
}
这是我主课的一部分 它是激活显示功能的菜单项的动作侦听器 (我没有复制所有类,因为它有近1000行,但如果有必要,我可以提交所有代码)

dlog.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
csvFileNational Rd=新的csvFileNational();
ddispmodel ddispm=新的ddispmodel();
ddisp.setModel(ddispm);
文件数据文件=新文件(“D:\\cdne4\\WorkPlace\\homeline.csv”);
ArrayList Rs2=Rd.ReadCSVfile(数据文件);
ddispm.AddCSVData(Rs2);
System.out.println(“行:+ddispm.getRowCount());
System.out.println(“Cols:+ddispm.getColumnCount());
cl.show(cp,“显示面板”);
}
});
以及将日期从csv转换为arraylist的文件类

 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.util.ArrayList;
 import java.util.Arrays;

 public class CSVFileDomestic {
        private final ArrayList<String[]> Rs = new ArrayList<String[]>();
        private String[] OneRow;

        public ArrayList<String[]> ReadCSVfile(File DataFile) {
            try {
                BufferedReader brd = new BufferedReader(new              
            FileReader(DataFile));    
          while (brd.ready()) {
                    String st = brd.readLine();
                    OneRow = st.split(",");
                    Rs.add(OneRow);
                    System.out.println(Arrays.toString(OneRow));
                } 
            } 
            catch (Exception e) {
                String errmsg = e.getMessage();
                System.out.println("File not found:" + errmsg);
            } 
            return Rs;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.util.ArrayList;
导入java.util.array;
公共类CSVFile{
私有最终ArrayList Rs=新ArrayList();
私有字符串[]OneRow;
公共ArrayList ReadCSVfile(文件数据文件){
试一试{
BufferedReader brd=新的BufferedReader(新的
文件阅读器(数据文件);
while(brd.ready()){
字符串st=brd.readLine();
OneRow=圣斯普利特(“,”);
Rs.add(OneRow);
System.out.println(Arrays.toString(OneRow));
} 
} 
捕获(例外e){
字符串errmsg=e.getMessage();
System.out.println(“未找到文件:+errmsg”);
} 
返回Rs;
我是Java新手,这是我的第一个程序,你能更简单地解释一下吗

但是编辑的结果并没有在arraylist上设置

您需要重写TableModel的
setValueAt(…)
方法来保存数据

可能是这样的:

String[] row = data.get(row);
row[column] = value;
this.fireTableCellUpdated(row, col);
另外,
isCellEditable(…)
方法不应进行任何处理。它只会为给定列返回true/false。如果希望所有列都可编辑,则它应为:

public boolean isCellEditable(int row, int col) { 
    //setValueAt(Data, row, col);
    //this.fireTableCellUpdated(row, col);
    return true;
}
我完成这项工作,然后去做其他选择。 卡米克谢谢你的帮助,你给我的方式,这使我的答案。) 我花了将近6个小时试图去做,最后我得到了它。 如果某人感兴趣,答案是

public boolean isCellEditable(int row, int col) { 
    return true;
}
@Override
public void setValueAt(Object aValue, int row, int col){
    Data.get(row)[col]= (String) aValue;
    fireTableCellUpdated(row,col);
所以我只做了一个新方法setValueAT,它说我是camickr。 然后我去了甲骨文网站,读了一些关于它的文章,然后尝试了一下,但是
事实并非如此,因为aValue无法从对象转换为字符串,最后我将aValue初始化为字符串,所以现在它可以工作。然而,这并不是全部,它只是更改arraylist。需要新的方法将arraylist转换为csv文件。我现在正在处理它,可能在我展示它之后。对不起,我的理论是,我不熟悉java,只要了解它是如何工作的就可以了。)

感谢您的回答,我以前尝试过这样做,但收到了诸如row-is-duplicate变量和方法.get()之类的错误不适用于arraylist
行-是重复变量
-是的,这显然是我的错误。请花时间理解代码的概念,并为变量指定不同的名称。
方法。get()不适用于arraylist
-如果解决了第一个问题,第二个问题应该会消失。同样,如果“row”是重复变量,编译器不知道如何解析该语句,因为它不知道“row”的正确数据类型。
public boolean isCellEditable(int row, int col) { 
    return true;
}
@Override
public void setValueAt(Object aValue, int row, int col){
    Data.get(row)[col]= (String) aValue;
    fireTableCellUpdated(row,col);