2015-07-22 97 views
0

我使用AbstractTableModel,我试图从JTable删除选定的行。所选行未被删除;而不是最后一行从JTable删除

我可以从表中选择特定的行;但是当我点击删除按钮时,所选行变为空(即所选行中的所有数据都变为空),最后一行从JTable中删除。

可能是,我认为,fireTableRowsDeleted()不工作。请帮助我。我搜索了整个stackoverflow,但我找不到解决方案。

请在下面找到我的代码。

// 删除按钮收听

btnDelRow.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //((DynamicTableModel) model).removeRow(table.getSelectedRow()); 
     int modelRowIndex = table.convertRowIndexToModel(table.getSelectedRow()); 
     DynamicTableModel model = (DynamicTableModel)table.getModel(); 
     model.removeRow(modelRowIndex); 

// 模型类

class DynamicTableModel extends AbstractTableModel { 

    private static final long serialVersionUID = 1L; 
    ArrayList<String> taskList; 
    ArrayList<String> dateList; 
    Map<Integer, Map<Integer, Object>> data = 
     new HashMap<Integer, Map<Integer, Object>>(); 
    int rows; 
    int columns; 
    int rowCount=0; 
    int colCount; 
    public DynamicTableModel(ArrayList <String> taskList, ArrayList <String> dateList) { 
     this.taskList = taskList; 
     this.dateList = dateList; 
     rowCount = taskList.size(); 
    } 
    @Override 
    public int getRowCount() { return data.size(); } 

    public int getRows() { 
     return rows; 
    } 
    @Override 
    public int getColumnCount() { return dateList.size()+2; } 

    @Override 
    public boolean isCellEditable(int row, int column) { 
     if (row == 0) return false; 
     else return true; 
     } 

    @Override 
    public Object getValueAt(int row, int column) 
    { 
     // Check for row 

     Integer key = new Integer(row); 
     Map<Integer, Object> rows = data.get(key); 

     if (rows == null) return null; 

     // Now check for column 

     key = new Integer(column); 
     return rows.get(key); 
    } 

    @Override 
    public String getColumnName(int column) { 
    return super.getColumnName(column); 
    } 
    @Override 
    public void setValueAt(Object value, int row, int column) 
    { 
     // Save cell data 
     Integer key = new Integer(row); 
     Map<Integer, Object> rows = data.get(key); 
     if (rows == null) 
     { 
      rows = new HashMap<Integer, Object>(); 
      if(!data.containsKey(key)) 
      data.put(key, rows); 
     } 
     key = new Integer(column); 
     rows.put(key, value); 
     fireTableCellUpdated(row, column); 
    } 
    public void addRow(){ 
     setValueAt("", getRowCount(), getColumnCount()); 
    } 
    public void removeRow(int row) { 
     Integer rowKey = new Integer(row); 
     data.remove(rowKey); 
     fireTableRowsDeleted(rowKey, rowKey); 

    } 
} 

请让我知道如果你需要在同任何其他信息。

例子:

说,有7排在我的名单,当我选择第4行并单击删除按钮。

而是第4行越来越删除,它变空,即第4行中的所有值变为零(因为我删除从列表中,data.remove(行)。

然而数据,最后行(第7行)是越来越删除,因为我已经把data.size()在getRowCount()。

+0

PL轻松编辑您的问题,以包含展示您描述的问题的[完整示例](http://stackoverflow.com/help/mcve)。 – trashgod

+0

如果用fireTableDataChanged()替换fireTableRowsDeleted(),结果相同; ? – milez

+0

是的,完全一样...... –

回答

0

我已经得到了最终解决方案。感谢所有您的帮助。

根本原因

I已经使用行作为HashMap的关键字。每当我从表中删除特定的行时,我将使用hashmap.remove()函数将从特定行中删除数据,但不会删除该行。由于我使用了fireTableRowsDeleted()方法,我的表得到了刷新,并且它将采用新的getRowCount(){hashmap.size()},它将从表中删除最后一行,因为行大小减少了1。

解决方案:

每当我从表中删除特定行,我会整理和更新行的其余部分。例如,如果以下是我在地图中的键和值(键只不过是行号)。

第1行--1,1

第二排--2,3

第三排--3,5

在这里,如果我删除第二行,然后我会删除第二并更新第3行,将其更新为2,值仍然为5.

所以结果会变成如下所示。

第1行 - 1,1

第二排 - 2,5

通过这种方式,我能达到的效果。 为此,我使用concurrentskiplistmap而不是hashmap。

请在下面找到更新的代码。

初始化的concurrentskiplistmap

Map<Integer, Map<Integer, Object>> data = new ConcurrentSkipListMap<Integer, Map<Integer, Object>>(); 

RemoveRow方法:

public void removeRow(int row) { 
       Integer rowKey = new Integer(row); 
       data.remove(rowKey); 
       sortTable(rowKey); 
       fireTableRowsDeleted(rowKey, rowKey); 
      } 

的SortTable方法:

private void sortTable(int rowkey) { 
       Iterator it = data.entrySet().iterator(); 
       int i=0; 
       while (it.hasNext()) { 
        Map.Entry pair = (Map.Entry)it.next(); 
        if(i>rowkey-1){ 

         Object obj = data.remove(pair.getKey()); 
         data.put(i, (Map<Integer, Object>) obj); 
        } 
        i++; 
       } 
      }