2011-07-16 77 views
0

我有一個表模型,我試圖實現insertRow功能。最終,我希望能夠從頂部向表中添加行,因此每次希望看到新添加的行時都不需要向下滾動。我很難想出如何實現這一點。我想地圖不會很有效,因爲每次我在位置0添加一個新行時,其他所有內容都需要增加1.因此,每次我添加一行我需要將所有行向下推一。這似乎是一旦桌子變大,它將會非常昂貴。當向底部添加一個值時,您只需更新該行即可。所以,我的問題是爲AbstractTableModel實現這個最有效的方法是什麼?使用TreeMap的AbstractTableModel <Integer,Vector <Object>作爲後盾如何實現insertRow()

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; 
    } 

} 

回答

1

不要不必要地使模型複雜化以解決視圖問題。相反,使用 scrollRectToVisible()here所述。如果稍後出現需求,則有一個AbstractTableModel示例here。該型號包含List<Value>。實施方案是ArrayList<Value>,但可以根據需要替換不同的實施方案,如LinkedList

相關問題