我猜想你的记录是放在VECTOR中的吧,那样的话,可以在在VECTOR中再加一个标记项,此项标记标识该条记录是被更改了,还是新增的或者是删除的.然后根据不同的标记进行不同的处理,我这有个自定义的TableModel看看能不能帮上忙.

解决方案 »

  1.   

    package com.tme.next.h.cmn.clview.table;import java.util.*;
    import javax.swing.table.*;
    import javax.swing.event.*;public class NextTableModel extends DefaultTableModel{ //真データモデル
    private DefaultTableModel trueModel = new DefaultTableModel();
    //行数
    private int rows;
    //列数
    private int cols;
    //ロールバック用データ
    private Vector backupValue; //列毎のカラムデータのクラス
    Class[] columnClasses = null; //行ヘッダの削除フラグ
    Vector deleteFlag = new Vector();
    //行ヘッダの変更フラグ
    Vector changeFlag = new Vector(); /**
     * コンストラクタ
     */
    public NextTableModel() {
    backupValue = new Vector();
    rows = 0;
    cols = 0;
    } /**
     * 表示行数を設定する
     * @param num   行数
     */
    public void setNumRows(int num){
    rows = num;
    this.updateModel();
    } /**
     * 表示列数を設定する
     * @param num   列数
     */
    public void setNumColumns(int num){
    cols = num;
    trueModel.setColumnCount(num);
    this.updateModel();
    } /**
     * 真データモデルに合わせて、
     * 表示用データモデルを編集する
     * 指定行数・列数に真データモデルが足りない場合は
     * 表示用データモデルを拡大する
     */
    public void updateModel(){
    if (cols == 0){
    return;
    } Vector trueDataVec = trueModel.getDataVector(); Vector newVec = new Vector();
    Vector newDeleteFlag = new Vector();
    Vector newChangeFlag = new Vector(); int i;
    for (i=0; i<trueModel.getRowCount(); i++){
    Vector rec = (Vector)trueDataVec.get(i);
    if (rec.size() < cols){
    for (int i0=rec.size(); i0<cols; i0++){
    rec.add("");
    }
    }else{
    for (int i0=cols; i0<rec.size(); i0++){
    rec.remove(rec.size()-1);
    }
    }
    newVec.add(rec);
    if(deleteFlag.size()-1<i){
    newDeleteFlag.add(Boolean.FALSE);
    newChangeFlag.add(Boolean.FALSE);
    }else{
    newDeleteFlag.add(deleteFlag.get(i));
    newChangeFlag.add(changeFlag.get(i));
    }
    }
    for (int j=i; j<rows; j++){
    Vector rec = new Vector();
    for(int j0=0; j0<cols; j0++){
    rec.add("");
    }
    newVec.add(rec);
    newDeleteFlag.add(Boolean.FALSE);
    newChangeFlag.add(Boolean.FALSE);
    }
    deleteFlag = newDeleteFlag;
    changeFlag = newChangeFlag;
    super.setDataVector(newVec, this.getColumnNameVector());
    } /**
     * データモデルを変更する
     * @param data  データ
     */
    public void setDataVector(Vector data){
    this.setDataVector(data, this.getColumnNameVector());
    } /**
     * データモデルを変更する
     * @param data  データ
     */
    public void setDataVector(Object[][] data){
    this.setDataVector(data, this.getColumnNameArray());
    } /**
     * データモデルを変更する
     * @param data  データ
     * @param cols  カラム名Vector
     */
    public void setDataVector(Vector data, Vector cols){
    if (data == null){
    for (int i =0; i<trueModel.getDataVector().size();i++){
    trueModel.removeRow(0);
    }
    }else{
    trueModel.setDataVector(data, cols);
    }
    backup();
    this.updateModel();
    } /**
     * データモデルを変更する
     * @param data  データ
     * @param cols  カラム名Vector
     */
    public void setDataVector(Object[][] data, Object[] cols){
    if (data == null){
    for (int i =0; i<trueModel.getDataVector().size();i++){
    trueModel.removeRow(0);
    }
    }else{
    trueModel.setDataVector(data, cols);
    }
    backup();
    this.updateModel();
    } /**
     * カラムデータのClass配列を設定します。
     * @param columnClasses
     */
    public void setColumnClasses(Class[] columnClasses){
    this.columnClasses = columnClasses;
    } /**
     * カラムデータのClassを取得します
     * @param column    列No
     * @return          Class
     */
    public Class getColumnClass(int column){
    if (columnClasses == null){return super.getColumnClass(column);}
    return columnClasses[column];
    } /**
     * カラムヘッダ名のVectorを取得するユーティリティ
     * @return  カラムヘッダVector
     */
    private Vector getColumnNameVector(){
    if (cols == 0){return null;}
    Vector vec = new Vector();
    for(int i=0; i<cols; i++){
    vec.add(this.getColumnName(i));
    }
    return vec;
    } /**
     * カラムヘッダ名の配列を取得するユーティリティ
     * @return  カラムヘッダ配列
     */
    private Object[] getColumnNameArray(){
    if (cols == 0){return null;}
    Object[] array = new Object[cols];
    for(int i=0; i<cols; i++){
    array[i] = this.getColumnName(i);
    }
    return array;
    } public int getColumnIndex(Object header){
        int result = -1;
    for(int i=0; i<this.getColumnCount(); i++){
    if (this.getColumnName(i).equals(header)){
    result = i;
    break;
    }
        }
    return result;
    } /**
     * 指定セルのデータを変更する
     * @param value 変更値
     * @param row   変更行
     * @param col   変更列
     */
    public void setValueAt(Object value, int row, int col){
    Object oldValue = trueModel.getValueAt(row, col);
    if (oldValue == null && value == null){return;}
    if (oldValue != null && oldValue.equals(value)){return;}
    if (value != null && value.equals(oldValue)){return;} trueModel.setValueAt(value, row, col);
    changeFlag.set(row, Boolean.TRUE);
    this.updateModel();
    } /**
     * 真データモデルの行数を取得する
     * @return  新データモデルの行数
     */
    public int getTrueRowCount(){
    return trueModel.getRowCount();
    } /**
     * 真データモデルの列数を取得する
     * @return  新データモデルの列数
     */
    public int getTrueColumnCount(){
    int col = trueModel.getColumnCount();
    if (col == 0){
    col = cols;
    } return col;
    } /**
     * 真データモデルを取得する
     * @return  新データモデル
     */
    public DefaultTableModel getTrueModel(){
    return trueModel;
    } /**
     * 行を追加する
     */
    public void addRow(){
    int col = trueModel.getColumnCount();
    if (col == 0){
    col = cols;
    }
    Vector vec = new Vector(col);
    for(int i=0; i<col; i++){
    vec.add("");
    }
    this.addRow(vec);
    changeFlag.add(Boolean.FALSE);
    deleteFlag.add(Boolean.FALSE);
    } /**
     * 行を追加し、値も変更する
     * @param vec   挿入値
     */
    public void addRow(Vector vec){
    if (rows < trueModel.getRowCount()){
    rows++;
    }
    trueModel.addRow(vec);
    backupValue.add(vec.clone());
    changeFlag.add(Boolean.TRUE);
    deleteFlag.add(Boolean.FALSE);
    this.updateModel();
    } /**
     * 指定行を削除する
     * @param row
     */
    public void removeRow(int row){
    if (row<0 || row>this.getTrueRowCount()-1){return;}
    trueModel.removeRow(row);
    backupValue.remove(row);
    deleteFlag.remove(row);
    changeFlag.remove(row);
    this.updateModel();
    } /**
     * 削除フラグが立っている行を実削除する
     */
    public void deleteFlagRow(){
    for (int i=0; i<deleteFlag.size(); i++){
    if (deleteFlag.get(i).equals(Boolean.TRUE)){
    removeRow(i);
    }
    }
    } /**
     * ロールアップ用のバックアップを取る
     */
    public void backup(){
    Vector dataVec = trueModel.getDataVector();
    backupValue = this.clone2(dataVec);
    } /**
     * 2次元Vectorデータを複製するユーティリティ
     * @param dataVec   2次元Vectorデータ
     * @return  複製データVector
     */
    private Vector clone2(Vector dataVec){
    Vector temp = new Vector();
    for (Enumeration e = dataVec.elements(); e.hasMoreElements(); ){
    temp.add(((Vector)e.nextElement()).clone());
    }
    return temp;
    } /**
     * 指定行のデータを復元する
     * @param index 行
     */
    public void rollBack(int index){
    Vector vec = trueModel.getDataVector();
    vec.setElementAt(((Vector)backupValue.get(index)).clone(),index);
    changeFlag.set(index, Boolean.FALSE);
    this.updateModel();
    } /**
     * 変更フラグを取得する
     * @return  変更フラグ
     */
    public Vector getChangeFlag(){
    return changeFlag;
    } /**
     * 変更フラグを設定する
     * @param row 対象行
     */
    public void addChangeFlag(int row){
    changeFlag.set(row, Boolean.TRUE);
    } /**
     * 削除フラグを取得する
     * @return  削除フラグVector
     */
    public Vector getDeleteFlag(){
    return deleteFlag;
    } /**
     * 削除フラグを