Я использую 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);
}
}
Пожалуйста, дайте мне знать, если вам нужна любая другая информация на то же самое.
Пример:
Say имеется 7 строк в моем списке, когда я выбираю 4-ю строку и нажмите на кнопку Удалить.
Вместо 4-ой строке получать удален, он становится пустым, то есть все значения в 4-й строке будет нулевым (так как я удалил данные из списка, data.remove (строка).
Однако последний строка (седьмой строка) становится удалена, так как я поставил data.size() в getRowCount().
Пл легко отредактируйте свой вопрос, включив в него [полный пример] (http://stackoverflow.com/help/mcve), в котором представлена проблема, которую вы описываете. – trashgod
Является ли результат тем же, если вы замените fireTableRowsDeleted() на fireTableDataChanged(); ? – milez
Да, точно так же ... –