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

时间:2016-05-24 02:03:23

标签: java swing csv abstracttablemodel

嘿伙计们我正在完成我的任务,现在我遇到了不可编辑单元格的问题,实际上它变得可编辑了,但是编辑的结果没有设置在arraylist,我尝试了很多来自互联网的解决方案,但它并没有&# 39;工作。 所以我的工作就像注册系统一样,获取有关客户的信息,然后将其存储到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;
}
}

这是我班级的一部分 是菜单项的动作监听器激活显示功能 (我没有复制所有课程,因为它有近1000行,但如果有必要,我可以提交所有代码)

  dlog.addActionListener(new ActionListener (){

  public void actionPerformed(ActionEvent e){
      CSVFileDomestic Rd = new CSVFileDomestic();
         ddispmodel ddispm = new ddispmodel();
            ddisp.setModel(ddispm);
            File DataFile = new File("D:\\cdne4\\WorkPlace\\Domestic.csv");
            ArrayList<String[]> Rs2 = Rd.ReadCSVfile(DataFile);
            ddispm.AddCSVData(Rs2);
            System.out.println("Rows: " + ddispm.getRowCount());
            System.out.println("Cols: " + ddispm.getColumnCount());

      cl.show(cp, "dispDomPanel");
  }
  });

和将日期从csv转换为arraylist

的File类
 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新手,这是我的第一个程序,请你能更容易解释

2 个答案:

答案 0 :(得分:2)

  

但是编辑的结果没有设置在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;
}

答案 1 :(得分:0)

我完成了这个))并去做其他选择。 camickr谢谢你的帮助,你给我的方式,这让我回答)) 我花了近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。 我去了Oracle网站并阅读了它,然后尝试了它,但是 它没有,因为aValue不能从object转换为String,最后我将aValue作为String启动,所以现在它可以工作。但不是全部,它只改变了arraylist。需要新方法将arraylist转换为csv文件。我现在正在努力,也许在我展示它之后。对不起我的理论,我是java新手,只是学习它是如何工作的))