我正在使用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()。
我终于找到了解决办法。谢谢大家的帮助。
根本原因:
我使用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 … 我