Вы имеете в виду, как это?
как этот http://img705.imageshack.us/img705/8920/screenshot7ry.png
Когда добавляется новая запись, ее идентификатор устанавливается как заголовок строки (как в записях, 1, 2, 3), а когда запись удаляется, заголовок строки остается, но информация исчезла (как в записях 4,5, которые используют для получения данных, но после удаления оставляют только идентификатор)
ЕСЛИ это то, что вы имеете в виду.
Что вам нужно сделать, так это создать две настольные модели, одну обернуть другой.
Единственной функцией оболочки будет показ дополнительного столбца (идентификатора) и сохранение внутренней «копии» данных.
При добавлении строки оболочка получит новую запись, назначит новый идентификатор, затем возьмет все поля и скопирует значение в свои данные, а затем перенаправит его в упакованный файл. настольная модель.
При удалении строки оболочка не удалит свою собственную запись, она только очистит (установит «») значения столбца и сохранит столбец id. Затем он перенаправит событие в перенесенный столбец, который, в свою очередь, фактически удалит строку.
Что-то вроде следующего некомпилируемого java
// Wrapper table model
class IdTableModel implements TableModelListener {
TableModel original;
// Analog to: Object[][]
List<List<Object> data = new ArrayList<List<Object>();
// will take a copy of the data in original
public IdTableModel( TableModel original ) {
this.original = original;
// fillData with values from original
for( int row = 0 ; row < original.getRowCount(); row++ ) {
List<Object> shadowRow = new ArrayList<Object>();
shadowRow.add( row ); // the id
// copy the values from original to this shadow
for( int column = 0 ; column < original.getColumnCount(); column++ ) {
shadowRow.add( original.getValueAt(row,i));
}
// add the shadow to the data
data.add( shadowRow );
}
original.addTableModelListener( this );
}
// for Object getValueAt( x, y ) get the data from your "data" not from the original
....
//Here's the magic. this wapper will be a listener of the original
// then this method will be invoked when the original gets more data
// or when it is removed.....
public void tableChanged( TableEvent e ) {
int row = e.getFirstRow();
List<Object> shadowRow = data.get( row);
switch( e.getType() ) {
case TableEvent.INSERT:
if( ( shadowRow =) == null ) {
// there wasn't shadow data at that position
data.add( ( shadowRow = new ArrayList<Object>()));
}
// takevalues from original
shadowRow.add( row ); // the id
for( int i = 0 ; i < original.getColumnCount();i++ ) {
shadowRow.add( original.getValueAt(row,i));
}
break;
case TableEvent.UPDATE:
// similar to insert, but you don't create a new row
// takevalues from original
for( int i = 0 ; i < original.getColumnCount();i++ ) {
shadowRow.set( i+1, original.getValueAt(row,i));
}
break;
case TableEvent.DELETE:
// You don't delete your shadow rows, but just clean it up
for( int i = 0 ; i < original.getColumnCount();i++ ) {
shadowRow.set( i+1, "");
}
break;
}
// forward calls to the original
public int getColumnCount(){
return original.getColumnCount()+1;
}
public String getColumnName( int columnIndex ) {
if( columnIndex == 0 ) {
return "id";
} else {
return original.getColumnName( columnIndex -1 );
}
}
// and so on for, isEditable etc. etc
}
Ну, это было гораздо больше кода, чем я хотел изначально.
Идея состоит в том, чтобы иметь оболочку табличной модели, которая добавляет для вас этот вымышленный столбец id
и не удаляет его, вы просто используете его так:
JTable yourTable = new JTable( new IdTableModel( originalTableModel ));
Если ничего из того, что я сказал, не имеет смысла для вас, начните читать это: Как использовать таблицы