2016-08-21 4 views
-1

Когда я пытаюсь удалить последнюю строку в Jtble, она вызывает ошибку OutBound.Ошибка при удалении последней строки Jtable

здесь код, который реализует JTable & DefaultTable:

Vector<String> rowOne = new Vector<>(); 
     rowOne.addElement("Harry"); 
     rowOne.addElement("100414"); 
     rowOne.addElement("21"); 
     rowOne.addElement("239438"); 
     rowOne.addElement("24/24/23"); 
     rowOne.addElement("30000"); 

     Vector<String> rowTwo = new Vector<>(); 
     rowTwo.addElement("Gordon"); 
     rowTwo.addElement("34353"); 
     rowTwo.addElement("25"); 
     rowTwo.addElement("2538"); 
     rowTwo.addElement("24/24/23"); 
     rowTwo.addElement("20000"); 

     Vector<Vector> rowData = new Vector<>(); 
     rowData.addElement(rowOne); 
     rowData.addElement(rowTwo); 

     columnNames = new Vector<>(); 
     columnNames.addElement("Name"); 
     columnNames.addElement("Cc"); 
     columnNames.addElement("Age"); 
     columnNames.addElement("Phone"); 
     columnNames.addElement("Date"); 
     columnNames.addElement("Amount"); 


     DefaultTableModel model = new DefaultTableModel(rowData, columnNames); 
     Jtable table = new JTable(model); 

Вот код удаления:

else if (e.getActionCommand().equals("deleteClient")) 
     { 
      if(table.getSelectedRow() != -1) 
      { 
       DefaultTableModel tModel1 = (DefaultTableModel) table.getModel(); 
       int seletedRow = table.getSelectedRow(); 

       tModel1.removeRow(seletedRow); 
      } 

Ошибка генерируется только при удалении строки последнего для JTable, когда я удалить Diferent строка как первая или средняя, ​​ошибка не возникает, как я могу ее решить?

+0

ли вы подтвердить свой индекс? Вы отобразили номер выбранной строки? Вы отображали количество строк в модели? Если он работает для других строк, он будет работать и для последней строки. Ниже приведен рабочий пример, который позволяет удалить 1 (или более) выбранные строки: http://stackoverflow.com/questions/37417494/how-do-i-make-swing-delete-an-entry-from-a- table-by-select-rows-and-click/37419226 # 37419226 – camickr

+0

Что означает u, если отобразить выбранный номер строки? – Cohen

+0

Как я упомянул, он отлично работает для всех строк, за исключением последнего, не знаю почему. – Cohen

ответ

2

Ты проблема не с линией

tModel1.removeRow(seletecdRow); 

но

int selectedRow = table.getSelectedRow(); 
int selectedCol = table.getSelectedColumn(); 
tModel1.removeRow(selectedRow); 
String name = (String) tModel1.getValueAt(seletecdRow, seletecdCol); // Here 

При удалении последней строки, индекс хранить в selectedRow больше не действует. Кроме того, всякий раз, когда вы удаляете строку, она отбирается и поэтому table.getSelectedRow() будет возвращать -1 (поскольку ни одна строка не выбрана).

Допустим, у вас есть 5 строк:

Вы можете выбрать любую строку из строки 1 к строке 4 (индекс 0 до 3) и удалите его. selectedRow = 0,1,2 or 3, и вы остаетесь с 4 рядами, поэтому все еще существует строка с индексом 0, 1, 2 или 3. и model.getValueAt(selectedRow... работает

Но если вы выберете строку 5 (последняя строка, указатель 4) и удалите ее. selectedRow = 4 и вы остаетесь с 4 строками (индекс 0, 1, 2, 3), но в индексе 4 больше нет строки, а model.getValueAt(selectedRow... дает ошибку

Решение зависит от того, что вы пытаетесь сделать в метке после удаления строки.

  • Если вы пытаетесь установить метку для отображения информации о удаленной строке:

    String name = (String) tModel1.getValueAt(table.getSelectedRow(), table.getSelectedColumn()); 
    labelStatus.setText(name); 
    tModel1.removeRow(table.getSelectedRow()); 
    
  • Если вы пытаетесь повторно выбрать другую строку в таблице и установите маркировать, чтобы отобразить данные этого вновь выбранной строки:

    int selectedRow = table.getSelectedRow(); 
    tModel1.removeRow(selectedRow); 
    int numRowsLeft = tModel1.getRowCount(); 
    if (numRowsLeft > 0) { // only reset selection if table is not empty 
        if (selectedRow > numRowsLeft - 1) { // last row deleted, new selection will be new last row 
         table.setRowSelectionInterval(numRowsLeft-1, numRowsLeft-1); 
        } else { // deleted from the start or middle, selectedRow now points to the next row after the deleted row 
         table.setRowSelectionInterval(selectedRow, selectedRow); 
        } 
        String name = (String) tModel1.getValueAt(table.getSelectedRow(), table.getSelectedColumn()); 
        labelStatus.setText(name); 
    } 
    
Смежные вопросы