选定的行不会被删除;相反,最后一行将从JTable中删除

时间:2015-07-22 01:27:05

标签: java swing jtable abstracttablemodel

我正在使用AbstractTableModel,并且我试图从JTable中删除所选行。

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

我认为,fireTableRowsDeleted()可能不起作用。请帮帮我。我已经搜遍了整个堆栈流程,但我无法找到解决方案。

请在下面找到我的代码。

// 删除按钮侦听器

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()。

1 个答案:

答案 0 :(得分:0)

我终于得到了解决方案。谢谢大家的帮助。

根本原因

我使用了row作为HashMap的键。每当我从表中删除特定行时,我将使用hashmap.remove()函数将从特定行中删除数据,但不会删除该行。

此外,由于我使用了fireTableRowsDeleted()方法,我的表被刷新了,它将采用新的getRowCount(){hashmap.size()},这将删除表中的最后一行,因为行大小减少了1。

<强>解决方案:

每当我从表中删除特定行时,我将对其余行进行排序和更新。

即例如,如果下面是我的键和地图中的值(键只是行号)。

第1行--1,1

第2行--2,3

第3行--3,5

如果我删除第2行,那么我将从Map中删除第2行,并通过将其键更新为2来更新第3行,并且值保持为5。

结果将如下所示。

第1行--1,1

第2行--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++;
                }
            }