I have a table model that I'm trying to implement an insertRow functionality. Ultimately, I would like to have the ability to add rows to the table from top so you would not need to scroll down every time you would like to see newly added rows. I'm having a hard time trying to figure out how to implement this. I'm thinking a map is not going to be very effective because each time I add a new row at position 0 everything else needs to be incremented by 1. So, every-time I add a row I need to push everything down by one. This seems like once a table gets large its going to be very costly. When adding a value to bottom you suinply just update that row. So, my question is what is the most efficient way to implement this for an AbstractTableModel?
public class MapTabelModel extends AbstractTableModel {
private static Logger logger = OpsToolsLogger.getLogger(MapTabelModel.class.getName());
private static final long serialVersionUID = 4086741767870369912L;
protected String[] columnNames = null;
protected Map<Integer, Vector<Object>> map = null;
/**
* Creates a new instance of MapTableModel.
*/
public MapTabelModel(String[] columnNames) {
this.columnNames = columnNames;
map = new TreeMap<Integer, Vector<Object>>();
}
/**
* Add a row to the table.
*
* @param row
* index to save the data to.
* @param entry
* the data
*/
public void addRow(int index, Vector<Object> entry) {
if(entry != null)
{
try
{
map.put(index, entry);
}
catch(NullPointerException e)
{
//System.out.println("test");
}
}
}
/**
* Clear the table model data.
*/
public void clear() {
map.clear();
}
/*
* (non-Javadoc)
*
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return columnNames.length;
}
/*
* (non-Javadoc)
*
* @see javax.swing.table.AbstractTableModel#getColumnName(int)
*/
@Override
public String getColumnName(int column) {
return columnNames[column];
}
/**
* Get entry at the given key
*
* @param key
* @return entry
*/
public Object getEntry(int key) {
return map.get(key);
}
/**
* Get entry at the given row index
*
* @param row
* @return entry
*/
public Object getRow(int row) {
Object[] keys = map.keySet().toArray();
Integer key = (Integer) keys[row];
return map.get(key);
}
/*
* (non-Javadoc)
*
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount() {
//System.out.println("maptable get size: " + map.keySet().size());
return map.keySet().size();
}
/*
* (non-Javadoc)
*
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
public Object getValueAt(int row, int column) {
Object obj = null;
try {
Object[] keys = map.keySet().toArray();//this create out of memomry errors???
if (row < keys.length) {
Integer key = (Integer) keys[row];
Vector<Object> vector = map.get(key);
if(vector != null && column < vector.size())
{
obj = vector.get(column);
}
else
{
//System.out.println("Could not get value at row: " + row + " column: "+ column);
}
}
} catch (ConcurrentModificationException e) {
logger.info(e.toString());
}
// Vector v = map.get(new Integer(row));
// Object obgj2 = v.get(column);
return obj;
}
/**
* Get the entry at the given key and column.
*
* @param key
* @param column
* @return entry
*/
public Object getValueAtByKey(int key, int column) {
return map.get(key).get(column);
}
/**
* Remove the entry at the given row
*
* @param row
* @return the entry removed
*/
public Object removeRow(int row) {
Object[] keys = map.keySet().toArray();
Integer key = (Integer) keys[row];
return map.remove(key);
}
/**
* Remove the entry by the key
*
* @param key
* @return the entry removed
*/
public Object removeRowByKey(int key) {
return map.remove(key);
}
/*
* (non-Javadoc)
*
* @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object,
* int, int)
*/
@Override
public void setValueAt(Object value, int row, int column) {
Object[] keys = map.keySet().toArray();
Integer key = (Integer) keys[row];
map.get(key).set(column, value);
}
/**
* Set the value at the given key and column
*
* @param value
* @param key
* @param column
*/
public void setValueByKey(Object value, int key, int column) {
if( map.get(key) != null)
{
map.get(key).set(column, value);
}
}
public void setColumnNames(String[] columnNames) {
this.columnNames = columnNames;
}
}