我正在使用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()。
答案 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++;
}
}