2016-10-06 2 views
0

Я попытался решить эту проблему, создав 2 отдельных массива данных, содержащих ту же информацию. Один из этих массивов данных (tableData) используется в конструкторе для JTable, в то время как другой (oldTableData) используется для изменения значений в ячейках до их первоначального значения при первом запуске приложения. Мне нужен второй массив данных, так как первый массив данных автоматически обновляется каждый раз, когда я изменяю значение в ячейке в таблице, можно ли отключить эту функцию JTable?Есть ли более эффективный способ сбросить содержимое ячеек, которые были отредактированы в JTable, до того, что они ранее были

Мне нужна эта функция, которая будет использоваться при нажатии кнопки отмены при редактировании ячеек в таблице, так как кнопка отмены отменяет все изменения, внесенные при редактировании ячеек. Вот моя реализация для кнопки отмены до сих пор:

if(e.getSource().equals(cancelMenuButton)) { 
     //prints set of edited cells 
     System.out.println("edited cells: "+editedCells); 

     ///once cancel button is clicked, disable both submit and cancel, as we are out of edit mode 
     cancelMenuButton.setEnabled(false); 
     submitMenuButton.setEnabled(false); 

     //reset values in table 
     Iterator<Point> iterator = editedCells.iterator(); 
     while(iterator.hasNext()) { 
      Point point = iterator.next(); 
      System.out.println("Value at "+point.x+", "+point.y+": "+table.getValueAt(point.y, point.x)); 
      System.out.println("Old value at "+point.x+", "+point.y+": "+oldTableData[point.y][point.x]); 

      table.setValueAt(oldTableData[point.y][point.x], point.y, point.x); 
     } 

     editedCells.clear(); 

     //cancel cell editing 
     CellEditor cellEditor = table.getCellEditor(); 
     if(cellEditor != null) { 
      if(cellEditor.getCellEditorValue() != null) { 
       cellEditor.stopCellEditing(); 
      } else { 
       cellEditor.cancelCellEditing(); 
      } 
     } 
    } 

Мой вопрос, является ли или не существует простой способ сделать это, один, который не требует создания двух одинаковых массивов данных. Спасибо.

+0

Что такое ваш код для setValueAt, для лучшей помощи soomer опубликовать SSCCE/MCVE, короткий, выполнимый, компилируемый, с жестким кодом для JTable/XxxTableModel в локальных переменных – mKorbel

ответ

1

является более простой способ сделать это,

Это, вероятно, самый простой способ сделать это. Вы можете просто создать новый TableModel, используя эти данные, и сбросить модель таблицы.

Однако проблема в том, что вам нужны две копии данных.

тот, который не требует создания двух идентичных массивов данных.

Затем вам нужно будет отслеживать, когда данные в ячейке будут изменены.

Таким образом, вы можете сохранить код HashMap, где ключ является строкой/столбцом, а данные являются исходным значением. Итак, на «Отмена» вы просто перебираете HashMap и восстанавливаете данные для каждого найденного на карте ключа.

Вы можете использовать Table Cell Listener для прослушивания изменений в TableModel. Затем всякий раз, когда генерируется событие, вы должны проверить строку/столбец HashMap, чтобы узнать, имеет ли оно значение. Если нет, вы сохраните исходное значение.

+0

Я надеялся, что был бы способ отключить первый массив данных от изменения после изменения ячейки, поэтому я мог бы просто собрать исходные значения из массива данных. Я думаю, что я просто придерживаюсь двух массивов. Спасибо за помощь. –

Смежные вопросы