Java 使用TreeMap的AbstractTableModel<;整数,向量<;对象>;作为如何实现insertRow()的支持
我有一个表模型,我正试图实现insertRow功能。最后,我希望能够从顶部向表中添加行,这样您就不必每次看到新添加的行时都向下滚动。我很难想出如何实现这一点。我认为贴图不会非常有效,因为每次我在位置0添加新行时,其他所有内容都需要增加1。因此,每次我添加一行,我需要将所有内容向下推一次。这似乎是一旦一张桌子变大,它的成本就会非常高。向底部添加值时,只需更新该行即可。所以,我的问题是,对于AbstractTableModel,实现这一点最有效的方法是什么Java 使用TreeMap的AbstractTableModel<;整数,向量<;对象>;作为如何实现insertRow()的支持,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我有一个表模型,我正试图实现insertRow功能。最后,我希望能够从顶部向表中添加行,这样您就不必每次看到新添加的行时都向下滚动。我很难想出如何实现这一点。我认为贴图不会非常有效,因为每次我在位置0添加新行时,其他所有内容都需要增加1。因此,每次我添加一行,我需要将所有内容向下推一次。这似乎是一旦一张桌子变大,它的成本就会非常高。向底部添加值时,只需更新该行即可。所以,我的问题是,对于AbstractTableModel,实现这一点最有效的方法是什么 public class MapTabel
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;
}
}
公共类MapTabelModel扩展了AbstractTableModel{
私有静态记录器Logger=OpsToolLogger.getLogger(MapTabelModel.class.getName());
私有静态最终长serialVersionUID=4086741767870369912L;
受保护字符串[]columnNames=null;
受保护映射=空;
/**
*创建MapTableModel的新实例。
*/
公共映射选项卡模型(字符串[]列名称){
this.columnNames=columnNames;
map=newtreemap();
}
/**
*向表中添加一行。
*
*@param行
*将数据保存到的索引。
*@param条目
*数据
*/
public void addRow(整数索引、向量条目){
if(条目!=null)
{
尝试
{
地图放置(索引、条目);
}
捕获(NullPointerException e)
{
//系统输出打印(“测试”);
}
}
}
/**
*清除表格模型数据。
*/
公共空间清除(){
map.clear();
}
/*
*(非Javadoc)
*
*@see javax.swing.table.TableModel#getColumnCount()
*/
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
/*
*(非Javadoc)
*
*@see javax.swing.table.AbstractTableModel#getColumnName(int)
*/
@凌驾
公共字符串getColumnName(int列){
返回columnNames[列];
}
/**
*按给定的键获取条目
*
*@param-key
*@返回条目
*/
公共对象getEntry(int键){
返回map.get(key);
}
/**
*获取给定行索引处的项
*
*@param行
*@返回条目
*/
公共对象getRow(int行){
Object[]keys=map.keySet().toArray();
整数键=(整数)键[行];
返回map.get(key);
}
/*
*(非Javadoc)
*
*@see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount(){
//System.out.println(“maptable get size:+map.keySet().size());
返回map.keySet().size();
}
/*
*(非Javadoc)
*
*@see javax.swing.table.TableModel#getValueAt(int,int)
*/
公共对象getValueAt(int行,int列){
objectobj=null;
试一试{
Object[]keys=map.keySet().toArray();//这是否会导致内存错误???
if(行<键长度){
整数键=(整数)键[行];
Vector=map.get(键);
if(vector!=null&&column
解决视图问题时,不要不必要地使模型复杂化。相反,使用
如前所述。如果以后需要,有一个AbstractTableModel
示例。模型包含一个列表
。实现是ArrayList
,但是可以根据需要替换不同的List
实现,例如LinkedList