当前位置: 首页 > 知识库问答 >
问题:

所选行未被删除;相反,最后一行将从JTable中删除

宇文卓
2023-03-14

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

我能够从表中选择特定的行;但当我单击delete按钮时,所选行变为空(即所选行中的所有数据变为空),最后一行将从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(row)中删除了数据)。

然而,最后一行(第7行)正在被删除,因为我已经放置了数据。getRowCount()中的size()。

共有1个答案

邓毅
2023-03-14

我终于找到了解决办法。谢谢大家的帮助。

根本原因:

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

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

解决方案:

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

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

第一行--1,1

第二排--2,3

第三排--3、5

这里,如果我删除第二行,那么我将从地图中删除第二行,并更新第三行,方法是将其键更新为2,值保持为5。

结果如下所示。

第一排--1,1

第二排--2,5

这样我就能达到目的。为此,我使用了concurrentskiplistmap而不是hashmap。

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

concurrentskiplistmap的初始化

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

RemveRow方法:

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

排序方法:

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++;
                }
            }
 类似资料:
  • 我是新来的希望你们能帮我。。。 我是java编程的初学者,我想我对这个问题有点不知所措。 我的程序运行得很好,除了一个让我恼火的小细节。我有一个JTable,第一列有一个按钮,可以从表中删除这一行。它工作得很好,除了当我试图删除表的最后一行时,按钮停留在那里,然后表冻结,我无法删除任何行,因为我收到了一个“越界异常”。但是,当我使用命令表时。getRowCount()); 在删除该行之前和之后,表

  • 我想从java中的表中删除选定的行。该事件应在单击按钮时执行。如果有人帮助我,我会非常感激。。。 例如,有一个名为sub\U table的表,有3列,即sub\U id、sub\U name、class。当我从该表中选择一行并单击“删除”按钮时,应删除该特定行。。

  • 我正在尝试更新JTable(或data?)的行在我对一行执行删除操作后,当选择另一行时,可以编辑所选行。当前删除该行将使已删除行下方的行上移,但如果选择了该行号并尝试进行编辑,则会返回(JOptionPane),就像未选择任何内容一样。它似乎没有“刷新”数据(?)。 这是一个SCCE,希望有人可以运行它并指出问题。我试着尽可能地缩小它,以便于复制/粘贴: 我在这里看到这个问题的各种形式都有一些不同

  • 问题内容: 我需要删除JTable中的所有行。 我已经尝试了以下两种方法: 和 两者都不会删除所有行。有任何想法吗? 问题答案: 以下代码为我工作:

  • 我正在用java创建一个没有数据库的库系统程序。(直接使用文件)。 我在删除jtable中的一行时遇到了一个奇怪的问题(也就是从文件中删除)。 有时当我在表格中选择一行并单击删除按钮时,不止一行被删除了! 大多数时候它也能正常工作!! 我的代码: 我的模型类: 用户信息类别: 我的文本文件:

  • 问题内容: 当我选择一行并按“删除”按钮时: 在摆动界面中,选定的行将被删除(如预期的那样)。但 在实际的数据库中,无论选择的行是什么(都不期望),最后一行都将被删除。无论实际选择的行是什么,被删除的行始终是数据库中的最后一行。我的代码中没有错误,也没有抛出异常。它的工作没有任何中断。 我实际上在代码中添加了必要的内容: 并添加“删除”按钮以删除选定的行: 问题答案: 谢谢@Germann … 我