2015-07-22 1 views
0

Я использую 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().

+0

Пл легко отредактируйте свой вопрос, включив в него [полный пример] (http://stackoverflow.com/help/mcve), в котором представлена ​​проблема, которую вы описываете. – trashgod

+0

Является ли результат тем же, если вы замените fireTableRowsDeleted() на fireTableDataChanged(); ? – milez

+0

Да, точно так же ... –

ответ

0

у меня есть решение, наконец. спасибо всем за вашу помощь.

Первопричина :

I «Я использовал строку в качестве ключа для HashMap. Всякий раз, когда я удаляю конкретную строку из таблицы, я использую функцию hashmap.remove(), которая удалит данные из определенной строки, но не удалит строку.

Кроме того, поскольку я использовал метод fireTableRowsDeleted(), моя таблица обновилась, и она получит новый getRowCount() {hashmap.size()}, который удалит последнюю строку из таблицы, так как размер строки уменьшился на 1.

Решение:

Всякий раз, когда я удалить определенную строку из таблицы, я разберусь и обновить остальные строки.

i.e Например, если ниже указаны мои ключи и значения на карте (ключи - это ничего, кроме номеров строк).

первый ряд --1, 1

второй ряд --2, 3

третий ряд --3, 5

Вот если удалить 2-ой строки, то я удалю 2-й и обновить 3-ей строку, обновив ее ключ как 2, а значения останутся равными 5.

Таким образом, результат будет выглядеть следующим образом.

первый ряд - 1, 1

второй ряд - 2, 5

Этим способом я могу достичь результата. Для этого я использовал compurrentskiplistmap вместо 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++; 
       } 
      }