Вы имеете в виду это?
как это 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 ));
Если ничего из того, что я сказал, не имеет для вас смысла, начните читать это: Как пользоваться таблицами
person
OscarRyz
schedule
16.04.2010