再送100分,csdn每人能解决的问题! 我猜想你的记录是放在VECTOR中的吧,那样的话,可以在在VECTOR中再加一个标记项,此项标记标识该条记录是被更改了,还是新增的或者是删除的.然后根据不同的标记进行不同的处理,我这有个自定义的TableModel看看能不能帮上忙. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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; } /** * 削除フラグを 小白java正则表达式遇到问题,求助啊。 滚动条问题 请教一个swing设计的思路 一个把我弄的有点糊涂的java问题 开始那贴沉下去了,再问:java怎么判断某个文件在被写呢? 帮我看看这个程序,为什么数据抓不出来呢 关于ANT 超级奇怪的问题 有哪位XDJM对applet有研究的帮帮忙,散分了。。 请问有谁能帮小弟理解一下runtime properties内的含义 如何实现Java下的回调函数! 请教:Java下用JAVA.UTIL.ZIP类压文件用ZIP8解压后文件变小不可用 这是什么错误,如何解决
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;
} /**
* 削除フラグを