AbstractTableModel с использованием TreeMap ‹Integer, Vector ‹Object› в качестве основы для реализации insertRow ()

У меня есть модель таблицы, в которой я пытаюсь реализовать функциональность insertRow. В конечном счете, я хотел бы иметь возможность добавлять строки в таблицу сверху, чтобы вам не приходилось прокручивать страницу вниз каждый раз, когда вы хотели бы видеть только что добавленные строки. Мне сложно понять, как это реализовать. Я думаю, что карта не будет очень эффективной, потому что каждый раз, когда я добавляю новую строку в позицию 0, все остальное нужно увеличивать на 1. Итак, каждый раз, когда я добавляю строку, мне нужно сдвигать все вниз на одну . Похоже, что как только таблица станет большой, это будет очень дорого. При добавлении значения внизу вы просто обновляете эту строку. Итак, мой вопрос: каков наиболее эффективный способ реализовать это для 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;
    }

}

person steve    schedule 16.07.2011    source источник


Ответы (1)


Не усложняйте модель без необходимости для решения проблемы просмотра. Вместо этого используйте scrollRectToVisible (), как описано здесь. Если в дальнейшем возникнет необходимость, есть AbstractTableModel пример здесь. Модель содержит List<Value>. Реализация - ArrayList<Value>, но при необходимости может быть заменена другая реализация List, такая как LinkedList.

person trashgod    schedule 17.07.2011